Is the following algorithm to solve non-linear equations in complex variable consistent?

2 views (last 30 days)
Dear users,
In order to solve the following equation((Z1/(ro_l*sqrt(G)))*((1-R).^2)* sqrt(1+0.25*(((ro_l*sqrt(G))/Z1)-(Z1/(ro_l*sqrt(G)))).^2*(sin(k*L)).^2) - 1=0) with respect to the complex variable G I have implemented this simple algorithm: function solveeqs()
guess=[1+i];
options = optimset('MaxFunEvals',1000000,'MaxIter',100000);
[result,fval,exit,output]=fsolve(@eqns,guess,options);
result
fval
eqns(guess)
output
end
function fcns=eqns(z)
G=z(1);
ro_s=2700; %insert density of the solid in kg/m3
cs= 3000;
Z1= ro_s*cs;
R= 0.995+i;
ro_l=1000;
om=10*10^6;
k=om/cs;
L=100*10^-6;
Z2=ro_l*sqrt(G);
fcns(1)= (Z1/Z2)*((1-R).^2) sqrt(1+0.25((Z2/Z1)-(Z1/Z2)).^2*(sin(k*L)).^2) - 1;
end
the result is the following:
Optimizer appears to be converging to a minimum that is not a root: Sum of squares of the function values is > sqrt(options.TolFun). Try again with a new starting point.
result =
2.7429e+004 -3.8961e+003i
fval =
-0.0182 - 0.0192i %result at last iteration
ans =
-5.2902e+003 +2.1171e+003i % first iteration result with guess value
output =
iterations: 78
funcCount: 158
algorithm: 'trust-region dogleg'
firstorderopt: 8.8405e-007
message: [1x169 char]
The message error rises because the solution obtained at the last iteration (the 78th) is of the order of magnitude 1 while this algorithm is consistent with a solution of the order of 10^-6. The doubt I have is: do you think this algorithm is consistent? working with complex number in fact I fear that matlab is not able to find a solution closer to the 0.
Is there a better way to threat this problem? (any other function or algorithm to threat with complex variable would be really usefull).

Accepted Answer

Matt J
Matt J on 12 Feb 2013
Edited: Matt J on 12 Feb 2013
I don't think FSOLVE supports complex-valued functions/variables and am amazed it ran without errors. This recent thread looks closely related
and suggests an alternative.
  4 Comments
kaust
kaust on 20 Mar 2013
Dear Matt,
I think there is small problem with the last line of the code. "sol=c( fsolve( @(x) g(c(f(x))), x0) )"
It should rather be sol=fsolve( @(x) g(c(f(x))), x0) can you please check to confirm.
Thanks
Matt J
Matt J on 20 Mar 2013
kaust,
If you don't feed the output of fsolve to c(), then your final result will not be a complex variable.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!