Fortran 90: Inclassable déclaration à (1) lors de l'appel d'une fonction
Je suis relativement nouveau pour fortran et j'ai une mission pour trouver la quadrature poids et les points où les points sont les zéros de la n-ième polynôme de legendre (trouvée en utilisant la méthode de newton); j'ai fait des fonctions pour trouver la valeur de Pn(x) et P n(x) à sous en newtons méthode a Cependant alors qu'en réalité, l'utilisation des fonctions de mon quadrature de sous-routine, il revient avec:
Coursework2a.f90:44.3:
x = x - P(n,x)/dP(n,x)
1
Erreur: Inclassable déclaration à (1)
Quelqu'un sait toutes les raisons pour lesquelles cette déclaration pourrait être considéré comme inclassable?
subroutine Quadrature(n)
implicit none
integer, parameter :: dpr = selected_real_kind(15) !Double precision
real(dpr) :: P, dP, x, x_new, error = 1, tolerance = 1.0E-6, Pi = 3.141592 !Define Variables
integer, intent(in) :: n
integer :: i
!Next, find n roots. Start with first guess then iterate until error is greater than some tolerance.
do i = 1,n
x = -cos(((2.0*real(i)-1.0)/2.0*real(n))*Pi)
do while (error > tolerance)
x_new = x
x = x - P(n,x)/dP(n,x)
error = abs(x_new-x)
end do
print *, x
end do
end subroutine Quadrature
- Vous déclarez P et dP comme des variables, c'est pourquoi le compilateur se plaint. Où sont les fonctions P et dP défini? si elles sont définies à l'intérieur d'un module, il suffit d'inclure le
USE module_name
déclaration - Aucun de mes 3 compilateurs signalé le problème que vous l'avez mentionné. Êtes-vous sûr que c'est le bon code? Le vieux chemin de des années soixante est d'utiliser le
external P, dP
. La façon moderne est l'utilisation de modules ou au moins de l'interface des blocs. - BTW, si vous pensez que
real(dpr) :: Pi = 3.141592
définit pi avec précision double précision, vous vous trompez. - Ce n'est pas réellement le cas P et dP sont explicitement un type, mais elles ne sont pas explicitement déclarées comme variables.
- Mon professeur nous a dit de définir les fonctions de ce genre (mais nous n'avons pas appris les modules encore). Comment dois-je définir Pi avec la double précision, Vladimir? J'ai réussi à me débarrasser de l'erreur en définissant une variable "ratio" = P(n,x)/dP(n,x) et de prendre que loin de newton la méthode au lieu de cela, Cependant, ma première hypothèse semble garder de me donner -1 (bien -0.999999917..) et je n'ai aucune idée pourquoi, donc, je continue de trouver la même racine pour chaque boucle
Vous devez vous connecter pour publier un commentaire.
La ligne
est susceptible de manquer une série de crochets autour du dénominateur. Comme il est, la ligne se divise
(2.0*real(i)-1.0)
par2.0
, puis multiplie le tout parreal(n)
. C'est peut-être pourquoi vous obtenez la même racine pour chaque boucle.