在Matlab中使用fsolve解析非线性方程

时间:2016-06-06 14:26:53

标签: matlab optimization nonlinear-functions nonlinear-optimization

我必须解决以下函数的非线性方程组:

function eq = ts_7(A,B,C,D,E)
syms x 
% dbstop if error

g = D * sin(C * atan( B*x - E * (B*x - atan(B*x)))) + A; % magic formula
eq5 = taylor(g, x, 'Order',1, 'ExpansionPoint',7) + 4296; % x^0
eq1 = taylor(g, x, 'Order',2, 'ExpansionPoint',7) - eq5 + 296.3; % x^1
eq2 = taylor(g, x, 'Order',3, 'ExpansionPoint',7) - eq1 - 79.77; % x^2
eq3 = taylor(g, x, 'Order',4, 'ExpansionPoint',7) - eq2 - 4.541; % x^3
eq4 = taylor(g, x, 'Order',5, 'ExpansionPoint',7) - eq3 - 0.03358; % x^4

eq{1} = matlabFunction(eq1) % syms to numeric function
eq{2} = matlabFunction(eq2)
eq{3} = matlabFunction(eq3)
eq{4} = matlabFunction(eq4)
eq{5} = matlabFunction(eq5)
end

我的主要是以下

opts = optimoptions('fsolve','InitDamping',0.005,'Algorithm','levenberg-marquardt');
init = [-1.3, 1.4, 4000, 0.12, 9]; % starting points 
tic
coeff = fsolve(@(x)ts_7(x(1), x(2), x(3), x(4), x(5)), init,opts);
toc

和我一直得到的错误是

  

未定义的功能或变量“fuser”。

     

fsolve错误(第257行)
  if~isempty(isoptimargdbl('FSOLVE',{'F','J'},fuser,JAC))

     

script_7中的错误(第11行)
  coeff = fsolve(@(x)ts_7(x(1),x(2),x(3),x(4),x(5)),init,opts);

     

跑步时出错(第96行)
  evalin('caller',[script';']);

我不知道如何修复它。我还尝试使用vpasolvesolve解决同样的问题。对于solve,它花费的时间太长,对于vpasolve,我得到的错误是非多边形方程中不允许使用符号参数。

有没有办法将字符串转换为函数(不是matlabFunction在此代码中正在执行的句柄函数)?

我变得绝望,因为我不想手工重写所有东西。

更新:我尝试解决2-D系统,例如来自http://nl.mathworks.com/help/optim/ug/fsolve.html。我得到了同样的错误,这是截图。 enter image description here

2 个答案:

答案 0 :(得分:2)

您的函数ts_7需要返回浮点向量,但eq是函数句柄的单元格数组。您也不需要五次致电matlabFunction。代替:

eq = matlabFunction([eq1;eq2;eq3;eq4;eq5]);

现在eq是一个函数句柄,它返回一个5乘1的双向列向量。这需要在扩展点x以数字方式进行评估,以便ts_7的输出是浮点向量,例如:

eq = eq(1);

如果您还要优化x或者您知道这一点,我也不清楚。

答案 1 :(得分:0)

我的MATLAB出了问题。我使用另一个版本的MATLAB解决了这个问题。

相关问题