2017-08-09 55 views
0

讓我們用sympy找到線性系統的外力不能代替積分常數到響應的積分

from sympy import * 

t, w, beta = symbols('t omega beta', positive=1) 
x0, v0 = symbols('x0 v0') 
x = symbols('x', cls=Function) 
homogeneous = diff(x(t), t, 2)/w**2+x(t) 
force = sin(beta*w*t) 
disp = dsolve(homogeneous-force, x(t)).rhs 
display(disp) 
constants = solve((disp.subs(t,0)-x0, disp.diff(t).subs(t,0)-v0)) 
display(constants) 

獲得

        sin(beta*omega*t) 
C1*sin(omega*t) + C2*cos(omega*t) - ----------------- 
              2   
             beta - 1  
      2        
     beta *v0 + beta*omega - v0   
[{C1: --------------------------, C2: x0}] 
       / 2 \    
      omega*\beta - 1/    

現在,來完成我的解決方案的響應,我試圖用這些常數的積分代入一般積分+積分

display(disp.subs(constants)) 

,給我

        sin(beta*omega*t) 
C2*sin(omega*t) + C2*cos(omega*t) - ----------------- 
              2   
             beta - 1  

我在哪裏犯過錯誤?

+0

什麼是你期望的輸出? – jmoon

+1

@jmoon - 在第二塊代碼中,我希望看到代替「C1」和「C2」的符號值,這些值是我在第一塊代碼塊的末尾計算和顯示的,因爲我已經讓sympy去操作這樣的替換。 – gboffi

回答

2

subs的參數應該是一個字典。

你從solve得到的不是字典,而是包含字典的單元素列表。使用它作爲

disp.subs(constants[0]) 

那麼結果是

x0*cos(omega*t) - sin(beta*omega*t)/(beta**2 - 1) + (beta**2*v0 + beta*omega - v0)*sin(omega*t)/(omega*(beta**2 - 1)) 
+0

哎呀,我知道它更好......我不得不說我被我之前發現的[答案](https://stackoverflow.com/a/41193705/2749397)部分誤導了我。非常感謝這兩個答案。 – gboffi