在MATLAB中划分差异

时间:2015-11-21 21:22:18

标签: matlab

我正在执行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个系数,多项式如下:

enter image description here

有5个系数

enter image description here

  

详细

我想绘制插值多项式,所以真正的整个代码如下所示:

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循环中:)

1 个答案:

答案 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))

依旧......