簡體   English   中英

在Matlab中求解5個非線性方程組

[英]Solving a system of 5 nonlinear equations in Matlab

我很難使用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 = b e /(d c)

y,x,k1,k2,P,Pref是我設置的所有參數,但希望將它們保留在函數中,以便我可以在代碼中快速更改它們以找到新答案。 a,b,c,d,e是我要求解的變量(它們是反應平衡方程的組成)

我試圖對函數中的參數進行硬編碼,但這沒有用。 我不確定該怎么辦。 我所做的每件事都會產生一個新錯誤。 最常見的是數據類型必須為“雙精度”。

編輯:添加代碼

首先功能:

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

我怎樣才能不讓它過早停止?

回復:我怎樣才能不讓它過早停止?

在調用中傳遞非默認選項以進行結算。

請在此處參考簽名fsolve(myfun,q,options), http://www.mathworks.com/help/optim/ug/fsolve.html

並在此處( http://www.mathworks.com/help/optim/ug/optimoptions.html)中了解有關使用optimoptions創建選項的信息

通過增加諸如TolFun和TolX的收斂標准的值,您應該能夠使其“不會過早停止”。

但是,建議您在此處閱讀依賴的基礎算法來執行此數字解決方案,(編輯:我試圖修復非鏈接鏈接,但我不允許提供兩個以上的鏈接... Boo )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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM