Finding Minimum value of an anonymous function using fminbnd

19 views (last 30 days)
Hi,
I am trying to find the minimum value of my anonyus function G, which depends on the variable na. I am getting the error "User supplied obective function mus return a scalar value" when I try to run my code. From some debugging, I can see that if I type G(0) in the command line, I get a 1X1000 double that is just the correct value for G(na=0), but repeated 1000 times. Can anyone help me fix this? Thanks for any advice, I've never posted on here before.
clear all
% Given :
R = 1.987; %[cal/mol*K]
T = 500; %[K]
G0 = -1000; %[cal/mol]
%% Find values to plot G vs. E
% Calulate na for a bunch of E:
% E: [0,1]
E = linspace(0,1,1000); % get 1000 evenly spaced values of E between 0 and 1
na = (.5.*(1-E)); % CHANGE THIS FOR THE EQUATION IN THE PROBLEM
% Calculate G-(ua/2)-(ub/2)
A = (1-(2.*na)); % define this bc it gets used a lot below
G = @(na) ((A.*G0)+((R*T).*((2.*na.*log(na))+(A.*log(A)))));
% plot it
figure();
plot(E, G(na))
title('Free Energy of System, G');
ylabel('G [cal/mol]'); xlabel('E');
% find minimum G value (equilbrium)
[na_min, Gmin] = fminbnd(G,na(end), na(2))

Accepted Answer

Bruno Luong
Bruno Luong on 8 Sep 2020
Edited: Bruno Luong on 8 Sep 2020
You should not mix between discrete sampling of your function G and continuous evaluation required by FMINBND
% Given :
R = 1.987; %[cal/mol*K]
T = 500; %[K]
G0 = -1000; %[cal/mol]
%% Find values to plot G vs. E
% Calulate na for a bunch of E:
% E: [0,1]
E = linspace(0,1,1000); % get 1000 evenly spaced values of E between 0 and 1
na = (.5.*(1-E)); % CHANGE THIS FOR THE EQUATION IN THE PROBLEM
% Calculate G-(ua/2)-(ub/2)
A = @(na) (1-(2.*na)); % define this bc it gets used a lot below
G = @(na) ((A(na).*G0)+((R*T).*((2.*na.*log(na))+(A(na).*log(A(na))))));
% find minimum G value (equilbrium)
[na_min, Gmin] = fminbnd(G,na(end), na(2))
Emin = 1 - na_min/0.5 % recover corresponding energy
figure();
plot(E, G(na),'b',Emin,Gmin,'+r')
title('Free Energy of System, G');
ylabel('G [cal/mol]'); xlabel('E');
  1 Comment
Emily Davenport
Emily Davenport on 8 Sep 2020
Hi Bruno,
Thank you for your help. That makes much more sense now, I had never encoutnered fminbnd before.

Sign in to comment.

More Answers (1)

Alan Stevens
Alan Stevens on 8 Sep 2020
You don't need fminbnd to find the minimum of G. Just
min(G(na))
will do it (or am I missing something?).

Categories

Find more on Systems of Nonlinear Equations in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!