Fortran中拉格朗日插值的不精确结果
我写了一个Fortran程序来计算两个数据集的拉格朗日插值:x,G。我不能正确地计算定义的函数。请看我做错了什么,因为当我的程序运行时,fxn的数字根本不准确(请看前两个程序(Matlab代码)以查看实际结果)。它们由作者提供,我正试图在Fortran上进行模拟:Fortran中拉格朗日插值的不精确结果,fortran,Fortran,我写了一个Fortran程序来计算两个数据集的拉格朗日插值:x,G。我不能正确地计算定义的函数。请看我做错了什么,因为当我的程序运行时,fxn的数字根本不准确(请看前两个程序(Matlab代码)以查看实际结果)。它们由作者提供,我正试图在Fortran上进行模拟: %% example 1.1 langrange interpolation %(Matlab) % X : interpolation points % Y : value of f(X) % x : points wh
%% example 1.1 langrange interpolation %(Matlab)
% X : interpolation points
% Y : value of f(X)
% x : points where we want an evaluation of P(x),
% where P is the interpolator polynomial
x = [-1:0.01:1];
X = [-1:0.20:1];
y = 1./(1+25*x.^2);
Y = 1./(1+25*X.^2);
pol = lagrange_interp(X,Y,x)
%plot(x,pol,'k',x,y,'k--',X,Y,'k.');
legend('Lagrange Polynomial','Expected behavior','Data Points');
function polynomial = lagrange_interp(X,Y,x) %(Matlab)
n = length(X);
phi = ones(n,length(x));
polynomial = zeros(1,length(x));
i = 0;
j = 0;
for i = [1:n]
for j = [1:n]
if not(i==j)
phi(i,:) = phi(i,:).*(x-X(j))./(X(i)-X(j));
end;
end;
end;
for i = [1:n]
polynomial = polynomial + Y(i)*phi(i,:);
end;
!Lagrange Interpolation example !(Fortran)
program Lagrange
implicit none
integer:: i
integer, parameter:: n=10
integer, parameter:: z=201
integer, parameter:: z1=11
real, parameter:: delta=.01
real,parameter:: delta2=.20
real, dimension(1:z):: x,G,y,H
real*8, dimension(1:n):: M
real*8, dimension(1:n):: linterp(n)
x(1)=-1
G(1)=-1
do i=2,z
x(i)=x(i-1)+delta
y(i)=1/(1+25*(x(i)**2))
end do
print*, "The one-dimensional array x is:", x(1:z)
print*, "The one dimensional array y is", y(1:z)
do i=2,z1
G(i)=G(i-1)+delta2
H(i)=1/(1+25*(G(i)**2))
end do
print*,"The other one-dimensional array G is:", G(1:z1)
print*, "Then the one dimensional array H is", H(1:z1)
M=linterp(1:n)
print*, M(1:n)
end program
!Lagrange interpolation polynomial function !(Fortran)
real*8 function linterp(n)
implicit none
integer,parameter:: n=10
integer, dimension(1:n):: poly,pol
integer:: i, j
i=0
j=0
do i=1,n
do j=1,n
if (i/=j)then
poly(i,j)=poly(i,j)*(x(i)-G(j))/(y(i)-G(j))
end if
end do
end do
print*, poly(i,j)
do i=1,n
pol(i)=pol(i)+H(i)*poly(i,j)
end do
print*, pol(1:n)
end function
这意味着什么他们不准确?结果如何?如果你向别人展示你的代码(即使不是),请在代码中使用一致的缩进。很难看到代码的结构。这里有很多问题。您有几个未初始化的变量/数组,例如
pol
和poly
。为什么将n
作为参数传递给linterp
,但将其作为函数内的参数?您正在引用任何循环外的最后一个循环中的j
,该循环使用j
作为计数器。有几个范围错误等,我不相信这段代码甚至编译!实际上,real*8函数linterp(n);整数,参数::n=10
绝对不应该编译。我对Fortran很陌生,你一定猜到了,但我试图直接使用上面的Matlab程序。如果你看一下Matlab脚本,pol和poly是要使用的两个不同的量(这就是为什么我在fortran函数的后一个循环中引用j);一个是二维阵列,另一个是一维阵列。也就是说,我怎样才能在我的主程序中运行这个函数呢?你们将如何重写这段代码以正确使用函数来生成“pol”和“poly”?上面的Matlab代码正在运行,如果需要参考,我将给出我希望在Fortran上仿真的结果。谢谢