在 Scilab 中生成符号插值多项式
Generate a symbolic interpolating polynomial in Scilab
我编写了一个代码,通过插值计算分差法和拉格朗日法的结果。我也想使用符号变量构建多项式,但我该如何实现?
function dividedDifferences(X,Y,x)
ddMatrix = X'
ddMatrix(:,2) = Y'
for j=3:length(Y)+3
for i=1:length(Y)+2-j
ddMatrix(i,j) = (ddMatrix(i,j-1)-ddMatrix(i+1,j-1))/(ddMatrix(i,1)-ddMatrix(i+j-2,1))
end
end
disp(ddMatrix)
Px = 0
for j=2:length(Y)+1
prd = 1
for i=1:j-2
prd = prd * (x - ddMatrix(i,1))
end
Px = Px + ddMatrix(1,j)*prd
end
disp(Px)
endfunction
function lagrange(X,Y,x)
for i=1:length(Y)
l(i)=1
for j=1:length(Y)
if i~=j
l(i) = l(i)*(x-X(j))/(X(i)-X(j))
end
end
end
disp(l')
L=0
for i=1:length(Y)
L = L+Y(i)*l(i)
end
disp(L)
endfunction
//example instance
X = [0 1 5 8]
Y = [0 1 8 16.4]
x = 7
dividedDifferences(X,Y,x)
lagrange(X,Y,x)
要创建符号多项式,请使用 x = poly(0,"x")
初始化符号变量,其中 x 是要在多项式中使用的变量的名称。然后按照您在函数 lagrange
中所做的那样继续使用它进行计算。我基本上将你的函数复制到下面的 symboliclagrange
,删除了数值参数和中间显示:
function symboliclagrange(X,Y)
x = poly(0,"x")
for i=1:length(Y)
l(i)=1
for j=1:length(Y)
if i~=j
l(i) = l(i)*(x-X(j))/(X(i)-X(j))
end
end
end
L=0
for i=1:length(Y)
L = L+Y(i)*l(i)
end
disp(L)
endfunction
根据您的输入 X = [0 1 5 8]
、Y = [0 1 8 16.4]
,输出为 0.85x+0.15x2,这是正确的插值多项式。
我编写了一个代码,通过插值计算分差法和拉格朗日法的结果。我也想使用符号变量构建多项式,但我该如何实现?
function dividedDifferences(X,Y,x)
ddMatrix = X'
ddMatrix(:,2) = Y'
for j=3:length(Y)+3
for i=1:length(Y)+2-j
ddMatrix(i,j) = (ddMatrix(i,j-1)-ddMatrix(i+1,j-1))/(ddMatrix(i,1)-ddMatrix(i+j-2,1))
end
end
disp(ddMatrix)
Px = 0
for j=2:length(Y)+1
prd = 1
for i=1:j-2
prd = prd * (x - ddMatrix(i,1))
end
Px = Px + ddMatrix(1,j)*prd
end
disp(Px)
endfunction
function lagrange(X,Y,x)
for i=1:length(Y)
l(i)=1
for j=1:length(Y)
if i~=j
l(i) = l(i)*(x-X(j))/(X(i)-X(j))
end
end
end
disp(l')
L=0
for i=1:length(Y)
L = L+Y(i)*l(i)
end
disp(L)
endfunction
//example instance
X = [0 1 5 8]
Y = [0 1 8 16.4]
x = 7
dividedDifferences(X,Y,x)
lagrange(X,Y,x)
要创建符号多项式,请使用 x = poly(0,"x")
初始化符号变量,其中 x 是要在多项式中使用的变量的名称。然后按照您在函数 lagrange
中所做的那样继续使用它进行计算。我基本上将你的函数复制到下面的 symboliclagrange
,删除了数值参数和中间显示:
function symboliclagrange(X,Y)
x = poly(0,"x")
for i=1:length(Y)
l(i)=1
for j=1:length(Y)
if i~=j
l(i) = l(i)*(x-X(j))/(X(i)-X(j))
end
end
end
L=0
for i=1:length(Y)
L = L+Y(i)*l(i)
end
disp(L)
endfunction
根据您的输入 X = [0 1 5 8]
、Y = [0 1 8 16.4]
,输出为 0.85x+0.15x2,这是正确的插值多项式。