首页 > 解决方案 > subs 在 MATLAB 中不能正确替换

问题描述

下面的代码应该模拟 Newton Raphson 方法来求解方程,但主变量 (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;

标签: matlab

解决方案


您遇到的问题不是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。

在尝试查找根之前,您应该始终做的一件事是确定函数是否有根。这个没有,它在任何地方都非常接近 -10,000,除了接近 0 时它在两边都趋向负无穷大,而在 0 时,由于除以 0 而无法评估函数。你可以通过 old- 看到这一点老式的函数分析,如果你在学校不再学习这个,只需fplot(F)了解函数的行为。


推荐阅读