下面的代碼應該模擬牛頓拉夫森方法來求解方程,但主變數 (V) 的替換適用于方程,但不適用于其導數。有人可以幫我處理這個錯誤嗎?我找不到 subs 只在上面一行而不是下面一行的原因 - 謝謝
close all;
clear all;
clc;
i = 0;
root = 0;
T = 50;
i = i 1;
R = 0.4615;
b = 0.00169;
a = 1.703;
P = 10000;
syms V
F = (R*T)/(V-b)- a/(V^2)- P;
DF = diff(F,V);
oldguess = 10;
newguess = 10;
realerror = 100;
acceptable_error = 0.0001;
while realerror > acceptable_error
f_V = vpa(subs(F,V,oldguess)); %% f_V receives a value
fd_V= vpa(subs(DF,V,oldguess)); %% fd_V doesnt get any value
newguess = oldguess - f_V/fd_V; %% this will be an error since we are dividing by zero
realerror = ((newguess-oldguess)/newguess)*100;
oldguess = newguess;
end
root = newguess;
uj5u.com熱心網友回復:
您遇到的問題不是subs(DF,V,oldguess)沒有給出任何值,而是在迭代多次后給出了 0。
將該行添加disp([f_V, fd_V])到回圈中。這是我看到的:
[ -9997.7091399665843527556156990531, -0.22742201327580833604722207521671]
[ -10000.00052501683105455937390418, -0.000000011945511284499679327573322611372]
[ -10000.000000000027564264394642461, -0.00000000000000000000003292691968007601924354847989367]
[ -10000.000000000000000000000000076, -2.5017500564189169087426021010076e-52]
[ -10000.0, -1.4442073343107664457291836426706e-110]
[ -10000.0, -4.8128331074807003817768165960745e-227]
[ -10000.0, -5.3449459015966837719809956687411e-460]
[ -10000.0, -6.5921690739471393457565679030652e-926]
[ -10000.0, -1.0027631932710798302770360761963e-1857]
[ -10000.0, -2.3202697552555340007454567882706e-3721]
[ -10000.0, -1.2422776383481875816235353595144e-7448]
[ -10000.0, -3.5610579836824354028159535601917e-14903]
[ -10000.0, -2.9261716619964961538294369733188e-29812]
[ -10000.0, -1.9757923974050109050486823460432e-59630]
[ -10000.0, -9.0079160415622390528769344757706e-119267]
[ -10000.0, -1.8723643738280768889550544416625e-238539]
[ -10000.0, -8.0895143138882494056514979405605e-477085]
[ -10000.0, -1.5100335803334613297994112468127e-954175]
[ -10000.0, -5.2615647621928018162324162884447e-1908357]
[ -10000.0, -6.3880977095623306259506020122841e-3816720]
[ -10000.0, -9.4163980840507503900230854098031e-7633446]
[ -10000.0, -2.0460268576440353827658449489008e-15266897]
[ -10000.0, -9.6597162693281748513616574438529e-30533801]
[ -10000.0, -2.1531309821705331994608199009543e-61067607]
[ -10000.0, -1.0697507758377953232431300192808e-122135220]
[ -10000.0, -2.6406262119508412798733809908278e-244270447]
[ -10000.0, 0]
Error using symengine
Division by zero.
第一次迭代將您從最初的猜測 10 帶到 -43951,隨后的每次迭代都會將您的猜測進一步推向負無窮大。在某些時候,您的導數太小,即使在vpa資料型別中也無法正確表示,并且四舍五入為 0。
在嘗試找到根之前,您應該始終做的一件事是確定函式是否有根。這個不是,除了接近 0 時它在兩邊都趨于負無窮之外,它在任何地方都非常接近 -10,000,而在 0 處,由于除以 0 無法計算函式。您可以通過 old- 看到這一點-老式的函式分析,如果你不再在學校學習這方面的知識,只需做fplot(F)一下函式行為的概述即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/323489.html
標籤:MATLAB
