【问题标题】:Solving a system of 5 nonlinear equations in Matlab在 Matlab 中求解一个由 5 个非线性方程组成的系统
【发布时间】:2015-11-25 02:49:14
【问题描述】:

我在使用 fsolve 函数在 Matlab 中求解一组 5 个方程时遇到了困难。

这是 5 个方程式:

y = a + d + e

y + x = c + d + 2e

2x = 4a + 2b + 2c

k1 = (d * b^3 / (a * c) ) * ((P/Pref)/(a+b+c+d+e))^2

k2 = be/(dc)

y,x,k1,k2,P,Pref 都是我设置的参数,但想将它们留在函数中,以便我可以在代码中快速更改它们以找到新的答案。 a,b,c,d,e 是我要求解的变量(它们是反应平衡方程的组成)

我尝试对函数中的参数进行硬编码,但没有成功。我只是不确定该怎么做。我改变的每一件事都会产生一个新的错误。最常见的是数据类型必须是“double”。

编辑:添加代码

首先是函数:

function F = myfun(Q,I)
a = Q(1);
b = Q(2);
c = Q(3);
d = Q(4);
e = Q(5);
x = I(1);
y = I(2);
k1 = I(3);
k2 = I(4);
P = I(5);
Pref = I(6);
F(1) = a + d + e - y;
F(2) = c + d + 2*e - y - x;
F(3) = 4*a + 2*b + 2*c - 2*x;
F(4) = ((d * b^3)/(a*c))*((P/Pref)/(a+b+c+d+e))^2 - k1;
F(5) = (b*e)/(c*d);

接下来是程序:

%Q = [a,b,c,d,e]
%I = [x,y,k1,k2,P,Pref]
%The values for the inputs will be changed to vary the output
%Inputs:
x=5;
y=1;
k1=5;
Pref=1;
P=1;
k2=-0.01;
syms K
k1 = solve(log10(k1) - k1);
syms L
k2 = solve(log10(k2) - k2);
x = double(x);
y = double(y);
Pref = double(Pref);
P = double(P);
k1 = double(k1);
k2 = double(k2);

%Solving:
I = [x,y,k1,k2,P,Pref];
q = [0,0,0,0,0]; %initial guess
Q = fsolve(@myfun,[q,I])

当我运行它时,会出现这些错误:

Error using myfun (line 7)
Not enough input arguments.

Error in fsolve (line 218)
            fuser = feval(funfcn{3},x,varargin{:});

Error in Coal (line 27)
Q = fsolve(@myfun,[q,I])

Caused by:
    Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.

编辑 2:更改了 fsolve 行,但仍然出现错误:

Error using trustnleqn (line 28)
Objective function is returning undefined values at initial point. FSOLVE cannot continue.

Error in fsolve (line 376)
    [x,FVAL,JACOB,EXITFLAG,OUTPUT,msgData]=...

Error in Coal (line 27)
fsolve(@(q) myfun(q,I),q)

Edit3:更改了几个参数和最初的猜测,我现在得到了答案,但它也想出了这个:

Solver stopped prematurely.

fsolve stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 500 (the default value).


ans =

    0.0000    2.2174    3.7473    1.4401    3.8845

我怎样才能让它不会过早停止?

【问题讨论】:

  • 你能展示你写的代码吗?
  • @David ,我添加了代码。
  • fsolve 仅适用于具有一个输入的函数,即使它是向量,因此请尝试使用 fsolve(@(q) myfun(q,I),q)
  • @David,我改了代码,出现了新的错误。
  • 可能在计算 F(4)F(5) 时,如果 a=0c=0d=0a+b+c+d+e=0 您将除以零,因为您的初始猜测是 @ 987654334@,我猜这可能是问题所在。

标签: matlab


【解决方案1】:

Re:我怎样才能让它不会过早停止?

在调用 fsolve 时传递非默认选项。

参考这里的签名,fsolve(myfun,q,options), http://www.mathworks.com/help/optim/ug/fsolve.html

在此处阅读有关使用 optimoptions 创建选项的信息, http://www.mathworks.com/help/optim/ug/optimoptions.html

您应该能够通过增加 TolFun 和 TolX 等收敛标准的值来使其“不会过早停止”。

但是,建议您阅读您在此处执行此数值解决方案所依赖的底层算法, (编辑:我试图修复非链接链接,但我不能提供超过两个......嘘)www.mathworks.com/help/optim/ug/fsolve.html#moreabout

您收到的错误只是表明经过 500 次函数评估后,算法尚未收敛到符合默认求解器选项的可接受解决方案。仅增加 MaxFunEvals 可能允许算法在默认容差内收敛所需的额外迭代。例如,

options = optimoptions('MaxFunEvals',1000); % try something bigger than 500
fsolve(@(q) myfun(q,I),q,options);

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    相关资源
    最近更新 更多