Solving a nonlinear equation with time-varying parameters

10 views (last 30 days)
ektor on 1 Nov 2017
Answered: Star Strider on 1 Nov 2017
Dear all,
I want to solve this nonlinear equation: (a*b*exp(-c*d))*exp(-x)+2*b -2*x-b=0,
where in each iteration of the algorithm the a,b,c,d change values.
So I set up the following algorithm
Myfun = @(x, a, b,c,d) (a*b*exp(-c*d))*exp(-x)+2*b -2*x-b;
fun = @(x) Myfun(x, a, b,c,d);
x0=0;
options = optimoptions('fsolve','Display','none');
A = fsolve(fun,x0,options);
Is this code correct the way I have written it? Is there an alternative faster way to solve this problem? Because I noticed that the above algorithm is very slow.

Star Strider on 1 Nov 2017
Since you are solving for a single parameter, the fzero function is an option, and in this simulation, faster:
v = mat2cell(rand(1000,4), ones(1,1000), ones(1,4)); % Create Variable Cell Array
Myfun = @(x, a, b,c,d) (a*b*exp(-c*d))*exp(-x)+2*b -2*x-b;
options = optimoptions('fsolve','Display','none');
t00 = clock;
for k1 = 1:1000
[a,b,c,d] = v{k1,:};
A0(k1) = fsolve(@(x)Myfun(x, a, b,c,d),1,options);
end
t01 = etime(clock, t00);
t10 = clock;
for k1 = 1:1000
[a,b,c,d] = v{k1,:};
A1(k1) = fzero(@(x)Myfun(x, a, b,c,d),1);
end
t11 = etime(clock, t10);
fprintf(1,'\n\tfsolve time = %.3f s\n\tfzero time = %.3f s\n\n',t01, t11)
fsolve time = 5.001 s
fzero time = 1.062 s