簡體   English   中英

Python - 時間相關系數的微分方程求解器為不同的時間偏移提供不同的動態

[英]Python - Differential equation solver for time-dependent coefficients gives different dynamics for different time offsets

我正在解決系統與脈沖相互作用時的動力學問題,這基本上是在解決與時間相關的微分方程。 一般來說,它工作得很好,但是每當我把脈沖的帶寬取小,即大約為單位時,求解器取決於脈沖從哪里開始 t0。 讓我給你代碼和一些圖片

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
from scipy.integrate import solve_ivp
import scipy as scipy

## Pulses 

def Box(t):
    return (abs(t-t0) < tau)
    #return  np.exp(-(t - t0)**2.0/(tau ** 2.0))


## Differential eq.
def Leq(t,u,pulse): 
    v=u[:16].reshape(4,4)
    a0=u[16] 
    da0=-a0+pulse(t)*E_0
    
    M=np.array([[-1,0,a0,0],\
                [0,-1,0,-a0],\
                [a0,0,-1,0],\
                [0,-a0,0,-1]])*kappa
    Dr=np.array([[1,1j,0,0],\
                [1j,1,0,0],\
                [0,0,1,1j],\
                [0,0,1j,1]])*kappa/2.0

    
    dv=M.dot(v)+v.dot(M)+Dr
    
    return np.concatenate([dv.flatten(), [da0]])
## Covariance matrix

cov0=np.array([[1,1j,0,0],\
                [1j,1,0,0],\
                [0,0,1,1j],\
                [0,0,1j,1]])/4 ##initial vector
cov0 = cov0.reshape(-1);   ## vectorize initial vector

a0_in=np.zeros((1,1),dtype=np.complex64) ##initial vector
a0_in = a0_in.reshape(-1);   ## vectorize initial vector
u_0=np.concatenate([cov0, a0_in])

### Parameters 
kappa=1.0 ##adimenstional kappa: kappa0/kappa 
tau=1.0  ##bandwidth pump

#Eth=kappa0*kappa/g  ##threshold intensity 
E_0=0.8 # pump intensity normalized to threshold 

t0=2.0   ##off set 

Tmax=10 ##max value for time
Nmax=100000 ##number of steps
dt=Tmax/Nmax  ##increment of time

t=np.linspace(0.0,Tmax,Nmax+1)

Box_sol=solve_ivp(Leq, [min(t),max(t)] , u_0, t_eval= t, args=(Box,))
print(Box_sol.y[0:16,int(Nmax/2)].reshape(4,4))

然后只是一些期望值和繪圖。

適當的動態

動態不好

從圖片中可以看出,參數是一樣的,唯一的區別是時間偏移t0。 似乎只要脈沖的帶寬很小,我就必須開始非常接近 t=0,我不完全理解為什么。 應該,不應該是這樣的。

是求解器的問題嗎? 如果是這樣,我該怎么做才能解決它? 我現在擔心這個問題會出現在我正在運行的其他模擬中,但我沒有意識到。

謝謝,瓊。

這是一個眾所周知的行為,關於這個話題有幾個問題。

簡而言之,就是步長 controller。 其背后的假設是 ODE function 平滑到高階,並且局部行為在中等范圍內通知全局行為。 因此,如果你開始平坦,隨着更高的導數消失,步長會迅速增加。 如果情況不幸,這將跳過積分器步驟的所有階段中的非平滑凸起。

有兩種策略可以避免這種情況

  • max_step設置為2*tau以便肯定會遇到凹凸,步長選擇將確保在跳躍周圍采樣密集。

  • 對跳轉的片段使用單獨的積分,使每個片段內的控制輸入是一個常數。

在此處輸入圖像描述

第一個變體在某種程度上濫用了步長 controller,因為它在跳躍周圍的一些啟發式緊急模式中超出規范。 第二個變體需要更多的編碼工作,但內部步驟更少,因為每個段的 ODE function 再次完全平滑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM