繁体   English   中英

Fortran中拉格朗日插值的结果不正确

[英]Inaccurate results from Lagrange Interpolation in Fortran

我编写了一个Fortran程序来计算两个数据集的Lagrange插值:x,G。 我无法正确评估定义的功能。 请查看我做错了什么,因为程序运行时,fxn的数字根本不准确(请参阅前两个程序(Matlab代码)以查看实际结果)。 它们由作者提供,是我试图在Fortran上模仿的内容:

  %% 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM