I have a code, but it keeps saying "Supplied objective function must return a scalar value.'

function Moles = Conv_func(H2, CO2, CO, CH4, H2O, T0, Pt, e11, e12, e13, e14)
% Call Sh_func to obtain entropy values
Sh_H2 = Sh_func('H2', T0);
Sh_CO2 = Sh_func('CO2', T0);
Sh_CO = Sh_func('CO', T0);
Sh_CH4 = Sh_func('CH4', T0);
Sh_H2O = Sh_func('H2O', T0);
% Compute standard entropies of reaction
Sr1 = (Sh_CH4(1) + Sh_CO2(1)) - (2*Sh_CO(1) + 2*Sh_H2(1)); % 1st reaction
Sr2 = (Sh_CO2(1) + Sh_H2(1)) - (Sh_CO(1) + Sh_H2O(1)); % 2nd reaction
Sr3 = Sh_CH4(1) - (2*Sh_H2(1)); % 3rd reaction
Sr4 = Sh_CO2(1) - (2*Sh_CO(1)); % 4th reaction
% Compute standard enthalpies of reaction
Hr1 = (Sh_CH4(2) + Sh_CO2(2)) - (2*Sh_CO(2) + 2*Sh_H2(2)); % 1st reaction
Hr2 = (Sh_CO2(2) + Sh_H2(2)) - (Sh_CO(2) + Sh_H2O(2)); % 2nd reaction
Hr3 = Sh_CH4(2) - (2*Sh_H2(2)); % 3rd reaction
Hr4 = Sh_CO2(2) - (2*Sh_CO(2)); % 4th reaction
% Compute equilibrium constants
k1 = exp(-Hr1*1000/(8.314*T0) + Sr1/8.314); % 1st reaction
k2 = exp(-Hr2*1000/(8.314*T0) + Sr2/8.314); % 2nd reaction
k3 = exp(-Hr3*1000/(8.314*T0) + Sr3/8.314); % 3rd reaction
k4 = exp(-Hr4*1000/(8.314*T0) + Sr4/8.314); % 4th reaction
% Solve for conversion using fminunc optimizer
e0 = [e11; e12; e13; e14]; % Initial condition for solver
r = fminunc(@(e) Sol_func(e, H2, CO2, CO, CH4, H2O, k1, k2, k3, k4, Pt), e0);
% Compute moles of species
Moles(1) = H2 + 2*r(1) - r(2) + 2*r(3);
Moles(2) = CO2 - r(1) - r(2) - r(4);
Moles(3) = CO + 2*r(1) + r(2) + 2*r(4);
Moles(4) = CH4 - r(1)- r(3);
Moles(5) = H2O - r(2);
end
my sol_func is :
function z = Sol_func(e, H2, CO2, CO, CH4, H2O, k1, k2, k3, k4, Pt)
e1 = e(1);
e2 = e(2);
e3 = e(3);
e4 = e(4);
ntot = H2 + CO2 + CH4 + CO + H2O; %Total number of moles
z = zeros(4, 1);
z(1) = (CH4 - e1 - e3) * (CO2 - e1 - e2 - e3) * k1 - (ntot + 2*e1+ e3+ e4)^-2 * (CO + 2*e1 + e2 + 2*e4)^2 * (H2 + 2*e1 + 2*e3)^2 * (Pt)^(-2);
z(2) = (H2 + 2*e1 + 2*e3) * (CO2 - e1 - e2 - e3) * k2 - (CO + 2*e1 + e2 + 2*e4) * (H2O + e2) * (Pt)^(-2);
z(3) = (CH4 - e1 - e3) * k3 - (ntot + 2*e1+ e3+ e4)^-1 * (H2 + 2*e1 + 2*e3)^2 * (Pt)^(-2);
z(4) = (CO2 - e1 - e2 - e3) * k4 - (ntot + 2*e1+ e3+ e4)^-1 * (CO + 2*e1 + e2 + 2*e4)^2 * (Pt)^(-2);
end

Answers (1)

I have a code, but it keeps saying "Supplied objective function must return a scalar value.'
Yes, that's true. Your function "Sol_func" must return a scalar value instead of a 4x1 vector. "fminunc" will then try to minimize this scalar value. Maybe you want to have the z(i) equal to 0 ; then you should return sum(z.^2).

2 Comments

I got this error
''fminunc stopped because it cannot decrease the objective function along the current search direction.''
What shall I say ? Bad luck :-)
If you want a constructive answer, we need code that we can execute and analyze.

Sign in to comment.

Categories

Find more on Simulate Responses to Biological Variability and Doses in Help Center and File Exchange

Asked:

on 5 Jul 2023

Commented:

on 6 Jul 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!