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

2 次查看(过去 30 天)
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).

采纳的回答

Matt J
Matt J 2013-2-12
编辑:Matt J 2013-2-12
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 个评论
kaust
kaust 2013-3-20
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 2013-3-20
kaust,
If you don't feed the output of fsolve to c(), then your final result will not be a complex variable.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Nonlinear Optimization 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by