在 matlab 中使用具有多个输入的 fsolve 求解非线性系统
Solving nonlinear system with fsolve with multiple inputs in matlab
我正在尝试使用 fsolve 求解一个由六个非线性方程组成的系统(见下文)。我的方程式中有一些额外的参数,我希望能够将它们输入到系统中或更改功能,而不必每次都进入我的函数并手动编辑它们。
它们是 F
、rho
和 A
。现在我已经将它们全部设置为 1,并且我能够得到一个解决方案,所以至少脚本是正确的 运行。
function f = pressXmanifold(x)
F = [1,1,1];
rho = 1;
A = 1;
f(1) = x(1)-x(3) - ...
1/2*rho*(x(4)/F(1))^2*...
A*(x(4)/x(6)*F(3)/F(1))^(-2)*...
(1+(F(3)/F(1))^2+3*(F(3)/F(1))^2*((x(4)/x(6))^2-(x(4)/x(6))));
f(2) = x(2)-x(3) - ...
1/2*rho*(x(5)/F(2))^2*...
A*(x(5)/x(6)*F(3)/F(2))^(-2)*...
(1+(F(3)/F(2))^2+3*(F(3)/F(2))^2*((x(5)/x(6))^2-(x(5)/x(6))));
f(3) = x(1) - x(3);
f(4) = x(2) - x(3);
f(5) = x(4) - x(5);
f(6) = x(4)+x(5) - x(6);
end
对于 F
我希望能够将任何 1 x 3 数组输入到我的函数中。
对于 rho
我也想输入一个值。
对于 A
,它必须根据以下条件(作为 if 语句给出)随着迭代而改变。
if F(3)/F(1) <= 0.35 && x(3)/x(2) <= 1
A = 1;
elseif F(3)/F(1) > 0.35 && x(3)/x(2) <= 0.4
A = 0.9*(1-x(3)/x(2));
elseif F(3)/F(1) > 0.35 && x(3)/x(2) > 0.4
A = 0.55;
end
目前我只尝试处理前两个参数。 f = pressXmanifold(x,F,rho)
并删除函数中的前两行。
但是当我尝试按照 MathWorks 网站上的说明进行操作时
options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);
fun = @pressXmanifold;
x0 = [1,1,1,1,1,1];
x = fsolve(fun,x0,F,rho,options)
无法执行赋值,因为这种类型的变量不支持点索引。
createOptionFeedback 出错(第 33 行)
选项.(stopTestOptions{k}) = [];
prepareOptionsForSolver 错误(第 57 行)
optionFeedback = createOptionFeedback(选项);
fsolve 中的错误(第 157 行)
[选项,optionFeedback] = prepareOptionsForSolver(选项,'fsolve');
重写 pressXmanifold,包括 F 和 rho 作为输入
function f = pressXmanifold(x1, x2, x3, x4, x5, x6, F, rho)
if F(3)/F(1) <= 0.35 && x3/x2 <= 1
A = 1;
elseif F(3)/F(1) > 0.35 && x3/x2 <= 0.4
A = 0.9*(1-x3/x2);
elseif F(3)/F(1) > 0.35 && x3/x2 > 0.4
A = 0.55;
end
f(1) = x1-x3 - ...
1/2*rho*(x4/F(1))^2*...
A*(x4/x6*F(3)/F(1))^(-2)*...
(1+(F(3)/F(1))^2+3*(F(3)/F(1))^2*((x4/x6)^2-(x4/x6)));
f(2) = x2-x3 - ...
1/2*rho*(x5/F(2))^2*...
A*(x5/x6*F(3)/F(2))^(-2)*...
(1+(F(3)/F(2))^2+3*(F(3)/F(2))^2*((x5/x6)^2-(x5/x6)));
f(3) = x1 - x3;
f(4) = x2 - x3;
f(5) = x4 - x5;
f(6) = x4+x5 - x6;
end
然后定义F和rho
rho = 1;
F =[1,1,1];
fun = @(x)pressXmanifold(x(1), x(2), x(3), x(4), x(5), x(6), F, rho);
终于
options = optimoptions('fsolve','Display','none','PlotFcn',...
@optimplotfirstorderopt);
x0 = [1,1,1,1,1,1];
x = fsolve(fun,x0,options)
我正在尝试使用 fsolve 求解一个由六个非线性方程组成的系统(见下文)。我的方程式中有一些额外的参数,我希望能够将它们输入到系统中或更改功能,而不必每次都进入我的函数并手动编辑它们。
它们是 F
、rho
和 A
。现在我已经将它们全部设置为 1,并且我能够得到一个解决方案,所以至少脚本是正确的 运行。
function f = pressXmanifold(x)
F = [1,1,1];
rho = 1;
A = 1;
f(1) = x(1)-x(3) - ...
1/2*rho*(x(4)/F(1))^2*...
A*(x(4)/x(6)*F(3)/F(1))^(-2)*...
(1+(F(3)/F(1))^2+3*(F(3)/F(1))^2*((x(4)/x(6))^2-(x(4)/x(6))));
f(2) = x(2)-x(3) - ...
1/2*rho*(x(5)/F(2))^2*...
A*(x(5)/x(6)*F(3)/F(2))^(-2)*...
(1+(F(3)/F(2))^2+3*(F(3)/F(2))^2*((x(5)/x(6))^2-(x(5)/x(6))));
f(3) = x(1) - x(3);
f(4) = x(2) - x(3);
f(5) = x(4) - x(5);
f(6) = x(4)+x(5) - x(6);
end
对于 F
我希望能够将任何 1 x 3 数组输入到我的函数中。
对于 rho
我也想输入一个值。
对于 A
,它必须根据以下条件(作为 if 语句给出)随着迭代而改变。
if F(3)/F(1) <= 0.35 && x(3)/x(2) <= 1
A = 1;
elseif F(3)/F(1) > 0.35 && x(3)/x(2) <= 0.4
A = 0.9*(1-x(3)/x(2));
elseif F(3)/F(1) > 0.35 && x(3)/x(2) > 0.4
A = 0.55;
end
目前我只尝试处理前两个参数。 f = pressXmanifold(x,F,rho)
并删除函数中的前两行。
但是当我尝试按照 MathWorks 网站上的说明进行操作时
options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);
fun = @pressXmanifold;
x0 = [1,1,1,1,1,1];
x = fsolve(fun,x0,F,rho,options)
无法执行赋值,因为这种类型的变量不支持点索引。 createOptionFeedback 出错(第 33 行) 选项.(stopTestOptions{k}) = []; prepareOptionsForSolver 错误(第 57 行) optionFeedback = createOptionFeedback(选项); fsolve 中的错误(第 157 行) [选项,optionFeedback] = prepareOptionsForSolver(选项,'fsolve');
重写 pressXmanifold,包括 F 和 rho 作为输入
function f = pressXmanifold(x1, x2, x3, x4, x5, x6, F, rho)
if F(3)/F(1) <= 0.35 && x3/x2 <= 1
A = 1;
elseif F(3)/F(1) > 0.35 && x3/x2 <= 0.4
A = 0.9*(1-x3/x2);
elseif F(3)/F(1) > 0.35 && x3/x2 > 0.4
A = 0.55;
end
f(1) = x1-x3 - ...
1/2*rho*(x4/F(1))^2*...
A*(x4/x6*F(3)/F(1))^(-2)*...
(1+(F(3)/F(1))^2+3*(F(3)/F(1))^2*((x4/x6)^2-(x4/x6)));
f(2) = x2-x3 - ...
1/2*rho*(x5/F(2))^2*...
A*(x5/x6*F(3)/F(2))^(-2)*...
(1+(F(3)/F(2))^2+3*(F(3)/F(2))^2*((x5/x6)^2-(x5/x6)));
f(3) = x1 - x3;
f(4) = x2 - x3;
f(5) = x4 - x5;
f(6) = x4+x5 - x6;
end
然后定义F和rho
rho = 1;
F =[1,1,1];
fun = @(x)pressXmanifold(x(1), x(2), x(3), x(4), x(5), x(6), F, rho);
终于
options = optimoptions('fsolve','Display','none','PlotFcn',...
@optimplotfirstorderopt);
x0 = [1,1,1,1,1,1];
x = fsolve(fun,x0,options)