首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Matlab求解一个5个非线性方程组

用Matlab求解一个5个非线性方程组
EN

Stack Overflow用户
提问于 2015-11-25 02:49:14
回答 1查看 1.6K关注 0票数 0

在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 = b_e/(d_c)

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

我试图对函数中的参数进行硬编码,但这是行不通的。我只是不知道该怎么办。我所做的每一件事都会产生新的错误。最常见的是数据类型必须是"double“。

编辑:添加代码

第一,职能:

代码语言:javascript
运行
复制
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);

接下来是节目:

代码语言:javascript
运行
复制
%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])

当我运行这个程序时,会出现以下错误:

代码语言:javascript
运行
复制
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,但仍然有错误:

代码语言:javascript
运行
复制
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:更改了几个参数,最初的猜测是,我现在得到了一个答案,但它也得到了以下结果:

代码语言:javascript
运行
复制
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

我怎么能不让它过早停止呢?

EN

回答 1

Stack Overflow用户

发布于 2015-11-25 06:08:45

我怎么才能不让它过早停止呢?

在您的调用中传递非默认选项以解决问题。

请参阅签名,fsolve(我的意思,q,选项)这里,http://www.mathworks.com/help/optim/ug/fsolve.html

并在这里阅读有关使用优化选项创建选项的文章,http://www.mathworks.com/help/optim/ug/optimoptions.html

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

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

您所收到的错误简单地表明,在500个函数评估之后,该算法尚未收敛到符合默认求解器选项的可接受的解决方案上。只要增加MaxFunEvals,就可以使算法在默认允许范围内收敛所需的额外迭代。例如,

代码语言:javascript
运行
复制
options = optimoptions('MaxFunEvals',1000); % try something bigger than 500
fsolve(@(q) myfun(q,I),q,options);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33907700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档