@@ -517,69 +517,69 @@ end
517
517
518
518
519
519
@testset " Measure Transformation for variance reduction" begin
520
- @parameters α β
521
- @variables t x (t) y (t) z (t)
522
- D = Differential (t)
523
-
524
- # Evaluate Exp [(X_T)^2]
525
- # SDE: X_t = x + \int_0^t α X_z dz + \int_0^t b X_z dW_z
526
- eqs = [D (x) ~ α* x]
527
- noiseeqs = [β* x]
528
-
529
- @named de = SDESystem (eqs,noiseeqs,t, [x],[α,β])
530
-
531
- g (x) = x[2 ]^ 2
532
- dt = 1 // 2 ^ (7 )
533
- x0 = 0.1
534
-
535
- # # Standard approach
536
- # EM with 1`000 trajectories for stepsize 2^-7
537
- u0map = [
538
- x => x0
539
- ]
540
-
541
- parammap = [
542
- α => 1.5 ,
543
- β => 1.0
544
- ]
545
-
546
- prob = SDEProblem (de,u0map,(0.0 ,1.0 ),parammap)
547
-
548
- function prob_func (prob, i, repeat)
549
- remake (prob,seed= seeds[i])
550
- end
551
- numtraj = Int (1e3 )
552
- seed = 100
553
- Random. seed! (seed)
554
- seeds = rand (UInt, numtraj)
555
-
556
- ensemble_prob = EnsembleProblem (prob;
557
- output_func = (sol,i) -> (g (sol[end ]),false ),
558
- prob_func = prob_func
559
- )
560
-
561
- sim = solve (ensemble_prob, EM (),dt = dt,trajectories = numtraj )
562
- μ = mean (sim)
563
- σ = std (sim) / sqrt (numtraj)
564
-
565
- # # Variance reduction method
566
- u = x
567
- demod = ModelingToolkit . Girsanov_transform (de, u; θ0 = 0.1 )
568
-
569
- probmod = SDEProblem (demod,u0map,( 0.0 , 1.0 ),parammap)
570
-
571
- ensemble_probmod = EnsembleProblem (probmod;
572
- output_func = (sol,i) -> ( g ( sol[x, end ]) * sol[weight, end ], false ),
573
- prob_func = prob_func
574
- )
575
-
576
- simmod = solve (ensemble_probmod,EM (),dt = dt,trajectories= numtraj)
577
- μmod = mean (simmod)
578
- σmod = std (simmod)/ sqrt (numtraj)
579
-
580
- display (" μ = $(round (μ, digits= 2 )) ± $(round (σ, digits= 2 )) " )
581
- display (" μmod = $(round (μmod, digits= 2 )) ± $(round (σmod, digits= 2 )) " )
582
-
583
- @test μ ≈ μmod atol = 2 σ
584
- @test σ > σmod
520
+ @parameters α β
521
+ @variables t x (t) y (t) z (t)
522
+ D = Differential (t)
523
+
524
+ # Evaluate Exp [(X_T)^2]
525
+ # SDE: X_t = x + \int_0^t α X_z dz + \int_0^t b X_z dW_z
526
+ eqs = [D (x) ~ α * x]
527
+ noiseeqs = [β * x]
528
+
529
+ @named de = SDESystem (eqs, noiseeqs, t, [x], [α, β])
530
+
531
+ g (x) = x[1 ]^ 2
532
+ dt = 1 // 2 ^ (7 )
533
+ x0 = 0.1
534
+
535
+ # # Standard approach
536
+ # EM with 1`000 trajectories for stepsize 2^-7
537
+ u0map = [
538
+ x => x0,
539
+ ]
540
+
541
+ parammap = [
542
+ α => 1.5 ,
543
+ β => 1.0 ,
544
+ ]
545
+
546
+ prob = SDEProblem (de, u0map, (0.0 , 1.0 ), parammap)
547
+
548
+ function prob_func (prob, i, repeat)
549
+ remake (prob, seed = seeds[i])
550
+ end
551
+ numtraj = Int (1e3 )
552
+ seed = 100
553
+ Random. seed! (seed)
554
+ seeds = rand (UInt, numtraj)
555
+
556
+ ensemble_prob = EnsembleProblem (prob;
557
+ output_func = (sol, i) -> (g (sol[end ]), false ),
558
+ prob_func = prob_func)
559
+
560
+ sim = solve (ensemble_prob, EM (), dt = dt, trajectories = numtraj)
561
+ μ = mean (sim )
562
+ σ = std (sim) / sqrt (numtraj )
563
+
564
+ # # Variance reduction method
565
+ u = x
566
+ demod = ModelingToolkit . Girsanov_transform (de, u; θ0 = 0.1 )
567
+
568
+ probmod = SDEProblem (demod, u0map, ( 0.0 , 1.0 ), parammap)
569
+
570
+ ensemble_probmod = EnsembleProblem (probmod;
571
+ output_func = (sol, i) -> ( g (sol[x, end ]) *
572
+ sol[demod . θ, end ] /
573
+ sol[demod . θ, 1 ], false ),
574
+ prob_func = prob_func )
575
+
576
+ simmod = solve (ensemble_probmod, EM (), dt = dt, trajectories = numtraj)
577
+ μmod = mean (simmod)
578
+ σmod = std (simmod) / sqrt (numtraj)
579
+
580
+ display (" μ = $(round (μ, digits= 2 )) ± $(round (σ, digits= 2 )) " )
581
+ display (" μmod = $(round (μmod, digits= 2 )) ± $(round (σmod, digits= 2 )) " )
582
+
583
+ @test μ≈ μmod atol= 2 σ
584
+ @test σ > σmod
585
585
end
0 commit comments