Код: Выделить всё
> reset; Digits := 15;
#Computations in atomic units
> Enrg := proc (n::integer, l::integer, R::numeric) if n < 0 then error "Main quantum number is less than zero, %1", n elif n-1 < l then error "Illegal orbital number, %1", l elif R <= 0 then error "Illegal radius, %1", R else return evalf(BesselJZeros(l+1/2, n)^2/R^2) end if end proc;
> Func := proc (n::integer, l::integer, R::numeric, x) if n < 0 then error "Main quantum number is less than zero, %1", n elif n-1 < l then error "Illegal orbital number, %1", l elif R <= 0 then error "Illegal radius, %1", R else return evalf(sqrt(2)*BesselJ(l+1/2, BesselJZeros(l+1/2, n)*x/R)/(R*BesselJ(l+3/2, BesselJZeros(l+1/2, n))*sqrt(x))) end if end proc;
> StrDipole := proc (n1::integer, l1::integer, n2::integer, l2::integer, R::numeric) local Dipole; if 2 <= abs(l2-l1) then error "It's not a dipole transition, l1 = %1, l2 = %2", l1, l2 else Dipole := evalf(int(Func(n1, l1, R, x)*x^3*Func(n2, l2, R, x), x = 0 .. R))^2; return (2/3)*(Enrg(n2, l2, R)-Enrg(n1, l1, R))*max(l1, l2)*Dipole(n1, l1, n2, l2, R)/(2*l1+1) end if end proc;
Программа состоит из 3х функций, использующих в качестве входные параметры типа integer и numeric. Целью является получение значений последней функции StrDipole в зависимости от заданного последнего параметра. Если написать, например, StrDipole(1,0,2,1,5) нужное число получаем. Но при попытке построить график
Код: Выделить всё
> plot(StrDipole(1, 0, 2, 1, x), x = 1 .. 20);
Error, invalid input: StrDipole expects its 5th argument, R, to be of type numeric, but received x
Как быть?