首页 文章

用fsolve求解MATLAB中的非线性方程组

提问于
浏览
0

我有一个代码在MATLAB中生成一个向量,例如以下是一个三分量向量( n=3 ):

a1_1 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 - 0.153233)
(15*a1_1)/16 + a2_1/4 + a3_1/32 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 - 0.0282326)
(3*a1_1)/4 + a2_1/2 + a3_1/8 - sin((17*a1_1)/60 + a2_1/8 + a3_1/40 + 0.846767)

正如您所看到的,每个组件都是非线性方程式 . 向量的三个分量形成一个由三个非线性方程组成的系统,其变量名为 a1_1a1_2a1_3 . 我想通过 fsolve 解决这个系统 .

我如何为任意 n 做到这一点?

2 回答

  • 1

    要使用fsolve,您的函数必须接受向量输入并返回相同大小的向量 . 在您的情况下,您可以使用anonymous function完成此操作:

    f = @(a)[a(1) - sin(17*a(1)/60 + a(2)/8 + a(3)/40 - 0.153233);...
             15*a(1)/16 + a(2)/4 + a(3)/32 - sin(17*a(1)/60 + a(2)/8 + a(3)/40 - 0.0282326);...
             3*a(1)/4 + a(2)/2 + a(3)/8 - sin(17*a(1)/60 + a(2)/8 + a(3)/40 + 0.846767)];
    n = 3;
    a0 = zeros(n,1); % Initial guess
    opts = optimoptions('fsolve','Display','iter','TolFun',1e-8);
    [a_sol,a_val,exitflag] = fsolve(f,a0,opts)
    

    这回来了

    a_sol =
    
      -0.002818738864459
      -0.687953796565011
       9.488284986072076
    

    当然,可能有不止一种解决方案,尤其是对于较大的解决方案 n . 您可以选择初始猜测来查找其他人 . 有关指定选项的更多详细信息,请参阅 fsolveoptimoptions的文档 .

  • 0

    你尝试使用solve命令了吗?

    [y1,...,yN] = solve(eqns,vars)求解变量vars的方程组eqns . 解决方案分配给变量y1,...,yN . 如果未指定变量,则使用symvar查找要求解的变量 . 在这种情况下,symvar找到的变量数等于输出参数N的数量 .

相关问题