2016-04-01 15 views
-3

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

+2

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 –

+0

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

+0

@ 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

cevap

0

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 
+0

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

+0

@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

+0

Tamam, bilmiyordum teşekkürler Cevabı ben düzenleyeceğim. – Charlie