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

时间:2015-08-03 05:28:38

标签: matlab function solver

我有一个在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 个答案:

答案 0 :(得分: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的文档。

答案 1 :(得分:0)

您是否尝试使用solve命令?

  

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