【问题标题】:wSolving non-linear equations using fsolve in Matlabw 在 Matlab 中使用 fsolve 求解非线性方程
【发布时间】:2023-03-10 02:59:02
【问题描述】:

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

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('调用者', [脚本';']);

我不知道如何解决它。我也尝试用vpasolvesolve 解决同样的问题。对于solve,它需要的时间太长,对于vpasolve,我得到一个错误,即非多边形方程中不允许使用符号参数。

有没有办法将字符串转换为函数(不是 matlabFunction 在这段代码中所做的句柄函数)?

我越来越绝望,因为我不想手动重写所有内容。

更新:我尝试求解二维系统,例如来自http://nl.mathworks.com/help/optim/ug/fsolve.html。我得到同样的错误,这是截图。

【问题讨论】:

    标签: matlab optimization nonlinear-functions nonlinear-optimization


    【解决方案1】:

    您的函数ts_7 需要返回一个浮点向量,但eq 是一个函数句柄元胞数组。您也无需拨打五次matlabFunction。而是:

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

    现在eq 是一个函数句柄,它返回一个 5×1 的双精度列向量。这需要在扩展点x 处进行数值计算,以便ts_7 的输出是一个浮点向量,例如:

    eq = eq(1);
    

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

    【讨论】:

    • 我知道 x,它是一个双精度数组,341x1。假设我有一个方程 eq5 = taylor(g, x, 'Order',1, 'ExpansionPoint',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 的文档。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多