我需要使用Fortran代碼來解決隨機微分方程(SDE)。 我看了Burkardt的著名Fortran代碼網站,
https://people.math.sc.edu/Burkardt/f_src/stochastic_rk/stochastic_rk.html
我特別看了 stochastic_rk.f90 代碼中的 rk4_ti_step 子程式,
https://people.math.sc.edu/Burkardt/f_src/stochastic_rk/stochastic_rk.f90我的優化版本如下,
子程式rk4_ti_step_mod ( x, t, h, q, fi, gi, seed, xstar )
使用隨機
隱式無
real ( kind = 8 ), external :: fi
real ( kind = 8 ), external :: gi
real ( kind = 8 ) h
實數 ( 種 = 8 ) k1
實數 ( 種 = 8 ) k2
實數 ( 種 = 8 ) K3
實數 ( 種 = 8 ) k4
實數(種類=8) q
實數 ( kind = 8 ) r8_normal_01
整數 ( 種類 = 4 ) 種子
實數 ( 種 = 8 ) t
實數 ( 種 = 8 ) t1
實數 ( 種 = 8 ) t2
實數 ( 種 = 8 ) t3
實數(種類=8) t4
實數(種類=8) w1
實數(種類=8) w2
實數 ( 種 = 8 ) W3
實數(種類=8) w4
實數(種類=8) x
實數(種類=8) x1
實數(種類=8) x2
實數(種類=8) x3
實數(種類=8) x4
實數(種類=8)X星
實數 ( 種 = 8 ) :: qoh
實數 ( 種 = 8 ) :: 正常(4)
實數(種類=8),引數:: a21 = 2.71644396264860D 00 &
,a31 = - 6.95653259006152D 00 &
,a32 = 0.78313689457981D 00 &
,A41 = 0.0D 00 &
,A42 = 0.48257353309214D 00 &
,A43 = 0.26171080165848D 00 &
,A51 = 0.47012396888046D 00 &
,A52 = 0.36597075368373D 00 &
,A53 = 0.08906615686702D 00 &
,a54 = 0.07483912056879D 00 &
,Q1 = 2.12709852335625D 00 &
,q2 = 2.73245878238737D 00 &
,q3 = 11.22760917474960D 00 &
,q4 = 13.36199560336697D 00
real ( kind = 8 ), parameter, dimension(4) :: qarray = [ 2.12709852335625D 00 &
,2.73245878238737D 00 &
,11.22760917474960D 00 &
,13.36199560336697D 00 ]
實數 ( kind = 8 ) :: warray(4)
整數 ( kind = 4 ) :: i
qoh = q / h
normal = gaussian(4)
做i =1,4
warray(i) = normal(i)*sqrt(qarray(i)*qoh)
結束
t1 = t
x1 = x
k1 = h * ( fi ( x1 ) gi ( x1 ) * warray(1) )
t2 = t1 a21 * h
x2 = x1 a21 * k1
k2 = h * ( fi ( x2 ) gi ( x2 ) * warray(2) )
t3 = t1 ( a31 a32 )* h
x3 = x1 a31 * k1 a32 * k2
k3 = h * ( fi ( x3 ) gi ( x3 ) * warray(3) )
t4 = t1 ( a41 a42 a43 ) * h
x4 = x1 a41 * k1 a42 * k2
k4 = h * ( fi ( x4 ) gi ( x4 ) * warray(4) )
xstar = x1 a51 * k1 a52 * k2 a53 * k3 a54 * k4
回傳
結束
注意,我使用了我的亂數模塊,而高斯是我的亂數函式,這部分并不重要。
我只是想知道,
我只是想知道
非常感謝您!
uj5u.com熱心網友回復:
x和c的相互依賴性意味著你不能像我最初想象的那樣變成線性代數,但我仍然期望通過將所有東西歸入適當的陣列來提高一些速度:
子程式 rk4_ti_step_mod ( x, t, h, q, fi, gi, seed, xstar )
使用隨機
隱式無
整數,引數 :: dp = selected_real_kind(15,300)
整數, 引數 :: ip = selected_int_kind(9)
real(dp), intent(in) :: x
real(dp), intent(in) :: t
real(dp), intent(in) :: h
real(dp), intent(in):: q
real(dp), external :: fi
實數(DP),外部 :: gi
整數(ip), 意圖(in) :: 種子
real(dp), intent(out) :: xstar
real(dp), parameter :: as(4,5) = reshape([ &
& 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, &
& 2.71644396264860_dp, 0.0_dp, 0.0_dp, 0.0_dp, &
& -6.95653259006152_dp, 0.78313689457981_dp, 0.0_dp, 0.0_dp, &
& 0.0_dp, 0.48257353309214_dp, 0.26171080165848_dp, 0.0_dp, &
& 0.47012396888046_dp, 0.36597075368373_dp, 0.08906615686702_dp, 0.07483912056879_dp &
& ], [4,5])
real(dp), 引數:: qs(4) = [ &
& 2.12709852335625_dp, &
& 2.73245878238737_dp, &
& 11.22760917474960_dp, &
& 13.36199560336697_dp]。]
real(dp) :: ks(4)
real(dp) :: r8_normal_01
real(dp) :: ts(4)
真實(DP) :: WS(4)
真實(DP) :: XS(4)
真實(DP) :: 正常(4)
real(dp) :: warray(4)
正態=高斯(4)
warray = normal*sqrt(qs)*sqrt(q/h)
做i=1,4
ts(i) = t sum(as(:i-1,i)) * h
xs(i) = x dot_product(as(:i-1,i), ks(:i-1))
ks(i) = h * (fi(xs(i)) gi(xs(i))*warray(i))
結束
xstar = x dot_product(as(:,5), ks)
結束子程式
盡管在不了解fi和gi的情況下很難判斷。
同時注意到你似乎沒有使用t1到t4的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308837.html
標籤:
上一篇:如何在springboot中運行一個方法的規定次數?
下一篇:azure管道條件總是回傳錯誤
