Fortran 90'da, bir matematiksel işlevi bir değişkenle belirli bir sınır dahilinde sayısal olarak birleştirmek istiyorum. Örneğin, f (x) = x ** 2'yi 0'dan 10'a entegre etme. Sahip olduğum işlev bundan daha karmaşıktır ve entegrasyon limitlerini değiştirerek birkaç kez çalıştırmak zorundayım. İnternette, 'QUADPACK' kütüphanesinin bana bu konuda yardımcı olabileceğini öğrendim. Ancak bu kütüphaneyi kodumda arayabilmek için nasıl kurabilirim? Gelişmiş talimatları hızlı bir şekilde takip edemeyeceğim gibi bazı ayrıntıları sağlayın.Fortran'da sayısal bütünleşme
cevap
x^2'yi entegre etmek için orta nokta yönteminin kullanıldığı basit bir program sağladım. Bu çalışmalı, daha karmaşık bir formül bu kadar uzun örgü yeterince iyi, girilebilir (ve işlev pürüzsüz) ..
program integrate
implicit none
integer,parameter :: cp = selected_real_kind(14)
integer,parameter :: N = 1000
real(cp),dimension(N) :: f,xc
real(cp),dimension(N+1) :: x
real(cp) :: s,xmax,xmin,dx
integer :: i
xmin = 0.0_cp
xmax = 10.0_cp
dx = (xmax - xmin)/real(N,cp)
x = (/(xmin + dx*(i-1),i=1,N+1)/)
! Define x at center
do i=1,N
xc(i) = x(i) + 0.5_cp*dx
enddo
! Define f
do i=1,N
f(i) = xc(i)**2
enddo
! Integrate (Midpoint method)
s = 0.0_cp
do i=1,N
s = s + f(i)*dx
enddo
write(*,*) 'sum = ',s
end program
Bu tanımda selected_real_kind öğesinin kullanılmasını sağlamak için x ** 2.0_cp kullanıyorum. Geçmişte sadece 2.0, hatta gerçek (2.0, cp) kullanarak sorunlar yaşadım. – Charlie
@francescalus sizin örneğinizde bazı parantezler gerekir .. '-1.0_cp ** 2' -1.0' dır .. Eğer bir şeyi kare demek istiyorsanız tamsayı 2 kullanın. – agentp
Tamam, bilmiyordum teşekkürler Cevabı ben düzenleyeceğim. – Charlie
https://en.wikipedia.org/wiki/Trapezoidal_rule veya https: //en.wikipedia.org/wiki/Simpson's_rule her ikisi de kendi kendini uygulamak için oldukça basittir –
Lütfen kullandığınız denklem hakkında daha fazla bilgi verin, kullandığınız işletim sistemini kullanın, böylece bu talimatlar sizin için yanıtlanabilir. özel durum. Bu daha yararlı olur. – Charlie
@ Charlie- Bunu herhangi bir genel denklem için bilmek isterim. Örneğin, bir * x ** 2 + b * x + c ile l1 ila l2 arasındaki limitlerin entegrasyonu a, b ve c'nin sabit olduğu yerlerdir. Bir dizi l1 ve l2 var, yani bu denklemi bir dizi sınırda birçok kez birleştirmem gerekiyor. – NewToFortran