这是我必须解决的问题:
编写一个程序,评估并绘制
Iu(x)
和u(x) = 1/(1+x^2)
之间x
的{{1}}的拉格朗日插值-5
。对5
点插值(5,7,9等数据点,包括-5和5)进行此操作。您的结果应显示函数和插值。
这是我到目前为止提出的代码:
5,7,9,11,13,15
我认为我走在正确的轨道上,但我真的开始陷入如何提取数据并很好地绘制所有内容的过程中。我到处搜索过,但大多数代码似乎只想输出拉格朗日多项式的值用于某些数字,即P(2)= ...
答案 0 :(得分:0)
在大多数情况下,您所开发的内容可以帮助您找到解决问题的正确途径。
您遇到的一些小问题是:
1)您错过了for
循环。
在拉格朗日插值中,您应该有n个项的总和,其中n是您拥有的数据点数。 并且这些术语由乘积乘以数据点的y分量,即yj *Π{(x-xi)/(xj-xi)},其中如果i = j则跳过该术语(这样做是为了确保分母永远不为零)
2)您的内部for
循环和if
声明无法很好地协同发挥。
只要您的脚本到达if
语句的末尾,for
循环就会中断,并且会继续显示下一个k
值。
这应该替换为else
后跟continue
。
3)当您生成numer
和denom
变量时,您无意中只是将新值平方并将其存储到变量中。
您有numer = numer * numer
这应该是numer = numer * numer_temp
以下是解决方案的快速伪代码:
for n equals 'number of data points'
Generate the n data points, P(x,y)
for i equals 1 to n
for j equals 1 to n
if i is not equal to j
Calculate Product of Numerators <- Function of x
Calculate Product of Denominators
else
Continue to next iteration of loop
endIf
endFor
Calculate Lagrange Polynomial < Function of x
endFor
Plot Lagrange
Plot Original Function
endFor
由此您可以更新代码以正确确定拉格朗日多项式。
u = @(x) 1./(1+x.^2); % The function we are interested in
number_of_data_Points = [5,7,9,11,13,15];
syms x; % Initializes x to be symbolic
for n = number_of_data_Points
xn = linspace(-5,5,n); % Creates x values
yn = u(xn); % Creates y values
L=0; % Re/Initializes Langrange Polynomial
for j = 1:n
numer = 1; % Re/Initializes Numerator
denom = 1; % Re/Initializes Denominator
for i = 1:n
if j~=i
denom_temp = xn(j) - xn(i);
numer_temp = x - xn(i);
numer = numer * numer_temp;
denom = denom * denom_temp;
else
continue
end
end
L = L + yn(j) * numer / denom;
end
L = matlabFunction(L);
end
我将保留更改代码,以便输出您需要的结果。