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

用Matlab中的fsolve求解非线性方程组,matlab,optimization,nonlinear-functions,nonlinear-optimization,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, 'Expans

我必须解一个非线性方程组,函数如下:

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))

脚本_7(第11行)中出现错误
coeff=fsolve(@(x)ts_7(x(1),x(2),x(3),x(4),x(5)),初始,选择)

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

我不知道怎么修理它。我还尝试用
vpasolve
solve
解决同样的问题。对于
solve
,它花费的时间太长,而对于
vpasolve
,我得到了一个错误,即非多边形方程中不允许使用符号参数

有没有办法将字符串转换成函数(而不是句柄函数?
matlabFunction
在这段代码中做了什么)

我越来越绝望,因为我不想手工重写一切


更新:我试图解决二维系统,例如。我得到同样的错误,这是截图

您的函数
ts_7
需要返回浮点向量,但
eq
是函数句柄的单元数组。您也不需要调用
matlabFunction
5次。相反:

eq = matlabFunction([eq1;eq2;eq3;eq4;eq5]);
现在,
eq
是一个函数句柄,它返回一个5×1的双精度列向量。这需要在扩展点
x
处进行数值计算,以便
ts_7
的输出为浮点向量,例如:

eq = eq(1);

我不清楚您是否也在优化
x
,或者您是否知道这一点。

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

我知道x,它是一个双精度数组,341x1。假设我有一个方程eq5=taylor(g,x,'阶',1,'展开点',7)+4296(x-7)。我必须传递x,还是把它设为8,这样(x-7)=1,我们就可以对它进行中和。我试着用你的修改运行代码,但它不是列向量,而是1x1函数句柄。而且我得到了同样的错误。有没有办法把符号转换成常规函数,而不是句柄函数?“我必须传递x吗?或者我只是把它设为8,这样(x-7)=1,我们就可以对它进行中和。”–我不知道你想解决什么问题,或者是什么
x
,所以我不能回答这类问题。“我尝试使用您的修改运行代码,但它不是一个列向量,而是一个1x1函数句柄。”–抱歉,我的答案的措辞有点不清楚。我在您的问题中使用了代码。我编辑了我的答案,以澄清
matlabFunction([eq1;eq2;eq3;eq4;eq5])
返回的
eq
是什么。”有没有办法将符号转换为常规函数,而不是句柄函数?”–函数句柄有什么问题?可以将函数写入文件,但这不是必须的。我建议阅读
matlabFunction
的文档。