Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Fortran中拉格朗日插值的不精确结果_Fortran - Fatal编程技术网

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

我写了一个Fortran程序来计算两个数据集的拉格朗日插值: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

这意味着什么他们不准确?结果如何?如果你向别人展示你的代码(即使不是),请在代码中使用一致的缩进。很难看到代码的结构。这里有很多问题。您有几个未初始化的变量/数组,例如
pol
poly
。为什么将
n
作为参数传递给
linterp
,但将其作为函数内的参数?您正在引用任何循环外的最后一个循环中的
j
,该循环使用
j
作为计数器。有几个范围错误等,我不相信这段代码甚至编译!实际上,
real*8函数linterp(n);整数,参数::n=10
绝对不应该编译。我对Fortran很陌生,你一定猜到了,但我试图直接使用上面的Matlab程序。如果你看一下Matlab脚本,pol和poly是要使用的两个不同的量(这就是为什么我在fortran函数的后一个循环中引用j);一个是二维阵列,另一个是一维阵列。也就是说,我怎样才能在我的主程序中运行这个函数呢?你们将如何重写这段代码以正确使用函数来生成“pol”和“poly”?上面的Matlab代码正在运行,如果需要参考,我将给出我希望在Fortran上仿真的结果。谢谢