Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 绘制勒让德多项式-为自己的方法获得不同的结果_Matlab_Polynomial Math_Approximation_Polynomials_Function Approximation - Fatal编程技术网

Matlab 绘制勒让德多项式-为自己的方法获得不同的结果

Matlab 绘制勒让德多项式-为自己的方法获得不同的结果,matlab,polynomial-math,approximation,polynomials,function-approximation,Matlab,Polynomial Math,Approximation,Polynomials,Function Approximation,我试图绘制勒让德多项式,定义为: P0(x) = 1 P1(x) = x Pn+1(x) = ((2n+1)/(n+1)) * x * Pn(x) - (n / (n+1)) * Pn-1(x) 我用了一种简单而缓慢的方法,我用了一种直接的,稍微复杂一点的方法。然而,两者的结果是一个相似的数字,而不是完全相同。振幅不同。下面是关于图的代码(注意,我将定义的下标n+1调整为n): 方法1: Pn = cell(n+1,1); Pn{1} = @ (x) 1; Pn{2} = @ (x) x; f

我试图绘制勒让德多项式,定义为:

P0(x) = 1
P1(x) = x
Pn+1(x) = ((2n+1)/(n+1)) * x * Pn(x) - (n / (n+1)) * Pn-1(x)
我用了一种简单而缓慢的方法,我用了一种直接的,稍微复杂一点的方法。然而,两者的结果是一个相似的数字,而不是完全相同。振幅不同。下面是关于图的代码(注意,我将定义的下标n+1调整为n):

方法1:

Pn = cell(n+1,1);
Pn{1} = @ (x) 1;
Pn{2} = @ (x) x;
for i=3:(n+1)
    Pn{i} = @ (x) ((2*(i-1)+1)/(i)).*x.*Pn{i-1}(x) - ((i-1)/i) .* Pn{i-2}(x);
end
plot(xi,Pn{1}(xi),'--r',xi,Pn{2}(xi),'--g',xi,Pn{3}(xi),'--b',...
    xi,Pn{4}(xi),'--m',xi,Pn{5}(xi),'--c',xi,Pn{6}(xi),'--k');
legend('P0','P1','P2','P3','P4','P5');
图1:

方法2:

%Notice here that the results of Pj get stored into YI(j+1)
YI = zeros(length(xi),6);
YI(:,1) = ones(size(xi))';
YI(:,2) = xi';
for i=3:6;
    Pn1 = 1;
    Pn2 = xi;
    for j=2:(i-1) 
        Pn3 = ((2*(j-1)+1)/j) .* xi .* Pn2 - ((j-1) / j) .* Pn1;
        Pn1 = Pn2;
        Pn2 = Pn3;
    end
    YI(:,i) = Pn3';
end
figure('Name','direct method');
plot(xi,YI(:,1)','--r',xi, YI(:,2)', '--g', xi, YI(:,3)', '--b', ...
    xi,YI(:,4)','--m', xi,YI(:,5)', '--c', xi,YI(:,6)', '--k');
图2:

至少可以说,这很奇怪。对于方法1,我正在计算所有直到P11的多项式,但只使用前6个来绘图。有人知道发生了什么吗?

方法2可以简单得多:

X = linspace(-1,1,500); X = X(:);
N = 10;

Y = zeros(numel(X),N);
Y(:,1) = 1;
Y(:,2) = X;
for n=1:(N-1)
    Y(:,n+2) = ((2*n+1) .* X .* Y(:,n+1) - n .* Y(:,n)) / (n+1);
end

figure, plot(X, Y(:,1:6))
legend(num2str((1:6)'-1,'P_%d(x)'))
xlabel('x'), ylabel('P_n(x)'), title('Legendre Polynomials')

这相当于在上


编辑: 我在数组索引中遇到了一个错误;MATLAB使用基于1的索引,但公式是以基于0的方式定义的。现在已经修好了,很抱歉弄乱了;)

要确认
p(n=2,x=0)
应为
-1/2

>> interp1(X, Y(:,3), 0)
ans =
   -0.5000

记住!在Matlab中,不要使用i和j作为变量名。它们是复杂的单元,你可能会搞砸Matlab的复杂数学。使用ii、jj或任何其他您想要的变量名,但不要使用i或j。你让Matlab变慢了(它需要更复杂地排序变量名),并且用复数破坏了任何内置函数中的数学。谢谢你的简化,但这并不能真正回答我的问题。我的方法到底出了什么问题?我已经使用了测试值为0的方法,将其输入到P2中。P2(t)被定义为3/2*t^2-1/2。我的方法是-0.5,这是正确的,而你的方法是-2/3,这显然不符合上述定义。然而,所有的勒让德多项式看起来都像你的曲线。我现在真的很困惑,我不知道发生了什么。@BananaCode:问题在于第二个for循环,对于j=3:I,它应该是
,而不是对于j=2:(I-1)
。正如您现在可能已经注意到的,您的代码通过反复从
P\u 0开始一直向上运行来计算
P\n
。。。多亏了method,您不必反复计算这些值,只需重新使用前(两)次迭代中的计算,但根据上面的定义,您的值是错误的!就像我说的,以P2为例。P2(0)应该等于-0.5,但你的应该等于-2/3。我毫不怀疑你是对的,但这个问题让我困惑。好吧,现在我确定了。您的索引错误@Amro。我的方法1是错误的,方法2是正确的。但是谢谢你的简单版本!
>> interp1(X, Y(:,3), 0)
ans =
   -0.5000