繁体   English   中英

Matlab:非线性方程求解器

[英]Matlab: Nonlinear equation solver

如何解决这些方程组,matlab可以找到解决方案吗? 我正在解决x1,x2,x3,x4,c1,c2,c3,c4。

syms c1 c2 c3 c4 x1 x2 x3 x4;
eqn1 = c1 + c2 + c3 + c4 == 2;
eqn2 = c1*x1 + c2*x2 + c3*x3 + c4*x4 == 0; 
eqn3 = c1*x1^2 + c2*x2^2 + c3*x3^2 + c4*x4^2 == 2/3;
eqn4 = c1*x1^3 + c2*x2^3 + c3*x3^3 + c4*x4^3 == 0;
eqn5 = c1*x1^4 + c2*x2^4 + c3*x3^4 + c4*x4^4 == 2/5; 
eqn6 = c1*x1^5 + c2*x2^5 + c3*x3^5 + c4*x4^5 == 0;
eqn7 = c1*x1^6 + c2*x2^6 + c3*x3^6 + c4*x4^6 == 2/7;
eqn8 = c1*x1^7 + c2*x2^7 + c3*x3^7 + c4*x4^7 == 0;

据我了解,matlab具有fsolve,resolve和linsolve,但我不确定如何使用它们。

您有一个非线性方程组,因此可以使用fsolve找到一个解决方案。

首先,您需要创建一个变量x的函数fcn ,其中x是具有初始点的向量。 该函数根据当前向量x定义输出向量。

您有八个变量,因此向量x将包含八个元素。 让我们以这种方式重命名变量:

%x1 x(1)      %c1 x(5)
%x2 x(2)      %c2 x(6)
%x3 x(3)      %c3 x(7)
%x4 x(4)      %c4 x(8)

您的函数将如下所示:

function F = fcn(x)

    F=[x(5) +          x(6)         + x(7)         + x(8)        - 2   ;
       x(5)*x(1)    +  x(6)*x(2)    + x(7)*x(3)    + x(8)*x(4)         ;
       x(5)*x(1)^2  +  x(6)*x(2)^2  + x(7)*x(3)^2  + x(8)*x(4)^2 - 2/3 ;
       x(5)*x(1)^3  +  x(6)*x(2)^3  + x(7)*x(3)^3  + x(8)*x(4)^3       ;
       x(5)*x(1)^4  +  x(6)*x(2)^4  + x(7)*x(3)^4  + x(8)*x(4)^4 - 2/5 ;
       x(5)*x(1)^5  +  x(6)*x(2)^5  + x(7)*x(3)^5  + x(8)*x(4)^5       ;
       x(5)*x(1)^6  +  x(6)*x(2)^6  + x(7)*x(3)^6  + x(8)*x(4)^6 - 2/7 ;
       x(5)*x(1)^7  +  x(6)*x(2)^7  + x(7)*x(3)^7  + x(8)*x(4)^7
       ];
end

您可以使用一些x初始值来评估函数:

x0  = [1; 1; 1; 1; 1; 1; 1; 1];

F0 = fcn(x0);

使用x0作为初始点,您的函数将返回:

F0 =

    2.0000
    4.0000
    3.3333
    4.0000
    3.6000
    4.0000
    3.7143
    4.0000

现在您可以启动fsolve ,它将尝试找到一些向量x ,例如您的函数返回全零:

[x,fval]=fsolve(@fcn, x0);

您将获得如下内容:

x =

    0.7224
    0.7224
   -0.1100
   -0.7589
    0.3599
    0.3599
    0.6794
    0.5768

fval =

   -0.0240
    0.0075
    0.0493
    0.0183
   -0.0126
   -0.0036
   -0.0733
   -0.0097

如您所见,函数值实际上接近于零,但是您可能注意到优化算法已停止,因为在options.MaxFunEvals存储的函数评估步骤数量有限(默认为800 )。 另一个可能的原因是MaxIter存储的迭代次数有限(默认为400 )。

使用参数options重新定义这些值:

options = optimset('MaxFunEvals',2000, 'MaxIter', 1000);

[x,fval]=fsolve(@fcn, x0, options);

现在您的输出要好得多:

x =

    0.7963
    0.7963
   -0.0049
   -0.7987
    0.2619
    0.2619
    0.9592
    0.5165
fval =

   -0.0005
   -0.0000
   -0.0050
    0.0014
    0.0208
   -0.0001
   -0.0181
   -0.0007

只需使用不同的参数值,以达到您的问题可以忍受的精度水平。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM