我正在执行Newton的分歧差异方法(here中的反向版本)但我在这部分中遇到了问题:
for j=1:n
for i=n:-1:j
d(i)=(d(i)-d(i-1))/(x(i)-x(i-j));
end
end
如何避免使用d(0)?
开始执行此过程到目前为止我已尝试过这个:
for j=1:n
for i=n:-1:j+1
d(i)=(d(i)-d(i-1))/(x(i)-x(i-j));
end
end
我希望这有帮助(我只需要某人验证):)。
以下是整个代码:)
n=15;
t=-5:5;
d=zeros(1,n);
x=linspace(-5,5,n);
for i=1:n
> d(i)=1/(1+x(i)^2);
end
>
> for j=1:n
> for i=n:-1:j+1
> d(i)=(d(i)-d(i-1))/(x(i)-x(i-j));
>
> end
> end
>
>
> disp('The coefficients are:')
disp(d)
我的结果
计算15个系数,多项式如下:
有5个系数
详细
我想绘制插值多项式,所以真正的整个代码如下所示:
n = 15;
t = -5:5;
d = zeros(1,n+1);
x = linspace(-5,5,n+1);
for i = 1:n+1
d(i)=1/(1+x(i)^2);
end
for j = 1:n
for i = n+1:-1:j+1
d(i) = (d(i)-d(i-1))/(x(i)-x(i-j));
end
end
disp('The coefficients are:')
disp(d)
x_1=linspace(-5,5,30);
y_1=d(1)+...
d(2).*(x_1-x(1))+...
d(3).*(x_1-x(1)).*(x_1-x(2))+...
d(4).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3))+...
d(5).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4))+...
d(6).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5))+...
d(7).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6))+...
d(8).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7))+...
d(9).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8))+...
d(10).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9))+...
d(11).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10))+...
d(12).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10)).*(x_1-(x(11)))+...
d(13).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10)).*(x_1-(x(11))).*(x_1-x(12))+...
d(14).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10)).*(x_1-(x(11))).*(x_1-x(12)).*(x_1-x(13))+...
d(15).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10)).*(x_1-(x(11))).*(x_1-x(12)).*(x_1-x(13)).*(x_1-x(14))+...
d(16).*(x_1-x(1)).*(x_1-x(2)).*(x_1-x(3)).*(x_1-x(4)).*(x_1-x(5)).*(x_1-x(6)).*(x_1-x(7)).*(x_1-x(8)).*(x_1-x(9)).*(x_1-x(10)).*(x_1-(x(11))).*(x_1-x(12)).*(x_1-x(13)).*(x_1-x(14)).*(x_1-x(15));
z_1=1./(1+(x_1).^2);
disp('Our differences are:')
disp(z_1-y_1)
plot(x_1,y_1)
但是这非常难看,所以我想把多项式y_1放在for循环中:)
答案 0 :(得分:2)
这是一个非常常见的索引问题。简单地将索引移动1可以解决它。你只需要记住,现在你的d(1)是旧的d(0)(或者说,你在数学文本中看到的d(0))。数学保持不变,你只需要对它们进行不同的索引。
n = 15;
t = -5:5;
d = zeros(1,n+1); % Give d one more element. The math notation d(0):d(15) will be equivalent to d(1):d(16) here.
x = linspace(-5,5,n+1);
for i = 1:n+1
d(i)=1/(1+x(i)^2);
end
for j = 1:n
for i = n+1:-1:j+1 % Also shift i by 1 because you use this to index d.
d(i) = (d(i)-d(i-1))/(x(i)-x(i-j));
end
end
这只是一个示例,向您展示如何规避索引问题。您必须自己验证数学有效性。
对于代码的最后一部分,您可以使用递归函数调用:
function y = ff(ii)
if ii > 0
y = ff(ii-1) + d(ii+1).*(x_1-x(ii));
else
y = d(1);
end
end
当ii = 1时,你会看到
y = ff(1) = ff(0) + d(2).*(x_1-x(1)) = d(1) + d(2).*(x_1-x(1));
当ii = 2时:
y = ff(2) = ff(1) + d(3).*(x_1-x(2)) = d(1) + d(2).*(x_1-x(1)) + d(3).*(x_1-x(2))
依旧......