具有复杂方程组的lsqnonlin

时间:2017-04-06 13:51:09

标签: matlab complex-numbers nonlinear-optimization

我有两个复杂的非线性方程,有两个复变量(然后是四个实变量)。 我尝试使用 lsqnonlin 而不是 fsolve 来为我的未知变量定义边界( lb,ub )。

options=optimset('Display','iter','MaxFunEvals',1e6,'TolX',1e-16);
fun = @myfun;
x0 = [0,0,1000/2,100/2];
lb = [0,0,0,0];
ub = [1,1,1000,100];
x = lsqnonlin(fun,x0,lb,ub,options)

我的功能有以下形式:

function F=myfun(x)

F(1) = a*x(3)+b*x(4)*1i - G1(x(1), x(2), x(3), x(4));
F(2) = c*x(3)+d*x(4)*1i - G2(x(1), x(2), x(3), x(4));

其中 a,b,c,d 是常数复数值, G(x(1),x(2),x(3),x(4))< / em>是一个非线性函数(也有复杂的组件)。运行 lsqnonlin 解算器后,我得到了以下错误消息: Levenberg-Marquardt算法不处理约束约束,信任区域反射算法至少需要与变量一样多的方程式; 中止。

首先,我没有使用Levenberg-Marquardt算法,因此我不认为错误是因为这个原因。然后,它让我认为 lsqnonlin 无法处理复杂的方程系统,也许它只能看到两个方程(尽管这两个复方程给出了四个实方程来解决我的四个实变量( x( 1),x(2),x(3),x(4))。

使用 lsqnonlin 时,我可以编写复杂的方程式系统吗?难道我做错了什么?我非常感谢你能给我的任何帮助。非常感谢提前))

1 个答案:

答案 0 :(得分:0)

正如lsqnonlin的matlab文档中所述(限制:第三点,或搜索“复杂”),您可以将其用于复杂值问题,而不受约束约束。如建议的那样,您应该像对复杂变量一样将F拆分为realimaginary部分。

Fc(1) = a*x(3)+b*x(4)*1i - G1(x(1), x(2), x(3), x(4));
Fc(2) = c*x(3)+d*x(4)*1i - G2(x(1), x(2), x(3), x(4));

F(1:2) = real(Fc);
F(3:4) = imag(Fc);