使用Newton-Raphson技术有两件事情不太正确……但肯定可以修复!在我们修复此问题后,您无需提到VPA错误.
错误#1 – 迭代更新
第一个是迭代本身.回想一下Newton-Raphson技术的定义:
对于下一次迭代,您使用上一次迭代的值.你正在做的是使用循环计数器并将其代入你的f(x),这是不正确的.它必须是前一次迭代的值.
错误#2 – 将符号值与数值混合
如果你看看你如何编写函数,你可以象征性地定义函数,但是你试图将数值替换为函数.遗憾的是,这并不适用于MATLAB.如果你真的想要替换值,你必须使用subs.这将替换你的实际值作为x的函数或你的函数使用的任何自变量.执行此操作后,您的值仍然是sym类型.您需要将其转换为double,以便能够以数字方式使用它.
同样为了提高效率,不需要制作数组.只需将此值设置为在每次迭代时更新自身.说到这一切,您的代码将更新为这样.请注意,我在循环之前采用了函数的导数,以减少需要采取的计算量.我还将Newton-Raphson迭代的分子和分母术语分开,以使事情变得清晰,并使其更适合潜艇.无需再费周折:
function r = mynewton(f,a,n)
syms x;
z = f(x);
diffZ = diff(z); %// Edit - Include derivative
y = a; %// Initial root
for idx = 1 : n
numZ = subs(z,x,y); %// Numerator - Substitute f(x) for f(y)
denZ = subs(diffZ,x,y); %// Denominator - Substitute for f'(x) for f'(y)
y = y - double(numZ)