数学表达式中(1)的未分类陈述

时间:2014-10-23 15:14:04

标签: plot fortran subroutine polynomial-math

我的第一个Fortran课程是绘制径向Sturmian函数的概率密度函数。如果您感兴趣,径向Sturmian函数用于绘制氢原子的动量空间本征函数。

为了产生这些径向函数,需要首先产生一些称为Gegenbauer多项式的多项式,表示为

C <子> B'/子> (x)时,

其中a和b应堆叠在一起。人们需要这些多项式,因为Sturmians(让他们称之为R_n,l)就像这样定义,

R_n,l(p)= N p l / (p 2 + k 2 l + 2 C n - l - 1 l + 1 p 2 - k 2 / p 2 + k 2 ),

其中N是归一化常数,p是动量,n是主量子数,l是角动量,k是常数。归一化常数是这样的,当我对这个函数求平方时,它将产生氢原子中电子动量的概率分布。

使用以下递归关系生成Gegenbauer多项式:

C n l (x)= 1 / n [2(l + n - 1) x C n - 1 l (x) - (2l + n - 2)C n - 2 l (x)]的,

C 0 l (x)= 1且C 1 l (x)= 2lx,你可能已经注意到了,l是固定的但是n不是。在程序开始时,我将同时指定l和n,并计算出我想要绘制的径向函数所需的Gegenbauer多项式。

我目前在代码中遇到的问题都在我的子程序中,用于计算Gegenbauer多项式C nl-1 l + 1 的值( p 2 - k 2 / p 2 + k 2 < / sub>)对于0到3之间的p的增量值。我不断收到错误

Unclassified statement at (1)

但我看不出是什么问题。

program Radial_Plot

    implicit none

    real, parameter :: pi = 4*atan(1.0)
    integer, parameter :: top = 1000, l = 50, n = 100
    real, dimension(1:top) :: x, y
    real increment
    real :: a=0.0, b = 2.5, k = 0.3
    integer :: i
    real, dimension(1:top) :: C

    increment = (b-a)/(real(top)-1)

    x(1) = 0.0
    do i = 2, top
        x(i) = x(i-1) + increment
    end do

    Call Gegenbauer(top, n, l, k, C)

    y = x*C
    ! y is the function that I shall be plotting between values a and b.


end program Radial_Plot


Subroutine Gegenbauer(top1, n1, l1, k1, CSub)

    ! This subroutine is my attempt to calculate the Gegenbauer polynomials evaluated at a certain number of values between c and d.

    implicit none

    integer :: top1, i, j, n1, l1
    real ::  k1, increment1, c, d
    real, dimension(1:top1) :: x1
    real, dimension(1:n1 - l1, 1:top1) :: C1
    real, dimension(1:n1 - l1) :: CSub


    c = 0.0
    d = 3.0
    k1 = 0.3
    n1 = 50
    l1 = 25
    top1 = 1000


    increment1 = (d - c)/(real(top1) - 1)

    x1(1) = 0.0
    do i = 2, top1
        x1(i) = x1(i-1) + increment1
    end do


    do j = 1, top1

     C1(1,j) = 1
     C1(2,j) = 2(l1 + 1)(x1(i)^2 - k1^2)/(x1(i)^2 + k1^2)
     ! All the errors occurring here are all due to, and I quote, 'Unclassifiable statement at (1)', I can't see what the heck I have done wrong.
        do i = 3, n1 - l1
                C1(i,j) = 2(((l1 + 1)/n1) + 1)(x1(i)^2 - k1^2)/(x1(i)^2 + k1^2)C1(i,j-1) - ((2(l1+1)/n1) + 1)C1(i,j-2)
        end do

    CSub(j) = Cn(n1 - l1,j)^2

    end do
    return
end Subroutine Gegenbauer

1 个答案:

答案 0 :(得分:1)

正如francesalus正确指出的那样,问题是因为你使用^代替**进行取幂。此外,您不会将*放在要倍增的术语之间。

 C1(1,j) = 1
 C1(2,j) = 2*(l1 + 1)*(x1(i)**2 - k1**2)/(x1(i)**2 + k1**2)

 do i = 3, n1 - l1
            C1(i,j) = 2 * (((l1 + 1)/n1) + 1) * (x1(i)**2 - k1**2) / &
                      (x1(i)**2 +  k1**2)*C1(i,j-1) - ((2(l1+1)/n1) + 1) * &
                      C1(i,j-2)
 end do

CSub(j) = Cn(n1 - l1,j)**2

因为你刚开始我有一些建议。学习将所有子程序和函数放到模块中(除非它们是内部的)。在子程序和子程序中没有return语句,就像在程序和程序中不需要stop语句一样。