有人可以帮我解决二阶微分,初始条件?(简单振荡器)
Can someone help me with solving a second orden differential,with initial condition?(Simple oscillator)
我是这个社区的新手,我正在寻求帮助,但找不到,所以我正在做这个问题。
我正在做关于在 python 上使用 sympy 的作业,可以提前编写方程式并求解它以获得通用解决方案。这是我的代码:
import sympy as sym
t=sym.symbols('t') #time
x=sym.Function('x')(t) #position
m=sym.symbols('m') #mass
k=sym.symbols('k')#const. 0<k
ac=x.diff(t,t)#acceleration
eos=sym.Eq(m*ac, -k*x)#equation
ecres=sym.dsolve(eos,x)#the general solution
这很好用,给我一个 C1 和一个 C2。但现在我正在尝试获得初始条件的解决方案。
x0=sym.symbols('x0')#initial condition for position
v0=sym.symbols('v0')#initial condition for velocity
vel=x.diff(t)#velocity
ics={t:0,x:x0,vel:v0}
ayuda=[[t,0],[x,x0],[vel,v0]]
我试过
ecres.evalf(subs={ics})
ecres.evalf(subs={ayuda})
终于
ecres.subs(t,0).subs(x,x0).subs(vel,v0)
但还是无法更改解决方案的C1 和C2。
¿我需要什么命令来改变它们?
非常感谢您的帮助。
Ps:抱歉有点长。
调用 dsolve
时应传递 ics。有一种指定 ics 的特定格式:
In [48]: t, m, k, x0, v0 = symbols('t, m, k, x0, v0')
In [49]: x = Function('x')(t)
In [50]: ac = x.diff(t, t)
In [51]: eos = Eq(m*ac, -k*x)
In [52]: dsolve(eos, x)
Out[52]:
_____ _____
╱ -k ╱ -k
-t⋅ ╱ ─── t⋅ ╱ ───
╲╱ m ╲╱ m
x(t) = C₁⋅ℯ + C₂⋅ℯ
In [54]: dsolve(eos, x, ics={x.subs(t, 0):x0, x.diff(t).subs(t, 0):v0})
Out[54]:
_____ _____
╱ -k ╱ -k
⎛ _____⎞ -t⋅ ╱ ─── ⎛ _____⎞ t⋅ ╱ ───
⎜ ╱ -k ⎟ ╲╱ m ⎜ ╱ -k ⎟ ╲╱ m
⎜-v₀ + x₀⋅ ╱ ─── ⎟⋅ℯ ⎜v₀ + x₀⋅ ╱ ─── ⎟⋅ℯ
⎝ ╲╱ m ⎠ ⎝ ╲╱ m ⎠
x(t) = ────────────────────────────────── + ────────────────────────────────
_____ _____
╱ -k ╱ -k
2⋅ ╱ ─── 2⋅ ╱ ───
╲╱ m ╲╱ m
我是这个社区的新手,我正在寻求帮助,但找不到,所以我正在做这个问题。 我正在做关于在 python 上使用 sympy 的作业,可以提前编写方程式并求解它以获得通用解决方案。这是我的代码:
import sympy as sym
t=sym.symbols('t') #time
x=sym.Function('x')(t) #position
m=sym.symbols('m') #mass
k=sym.symbols('k')#const. 0<k
ac=x.diff(t,t)#acceleration
eos=sym.Eq(m*ac, -k*x)#equation
ecres=sym.dsolve(eos,x)#the general solution
这很好用,给我一个 C1 和一个 C2。但现在我正在尝试获得初始条件的解决方案。
x0=sym.symbols('x0')#initial condition for position
v0=sym.symbols('v0')#initial condition for velocity
vel=x.diff(t)#velocity
ics={t:0,x:x0,vel:v0}
ayuda=[[t,0],[x,x0],[vel,v0]]
我试过
ecres.evalf(subs={ics})
ecres.evalf(subs={ayuda})
终于
ecres.subs(t,0).subs(x,x0).subs(vel,v0)
但还是无法更改解决方案的C1 和C2。 ¿我需要什么命令来改变它们? 非常感谢您的帮助。
Ps:抱歉有点长。
调用 dsolve
时应传递 ics。有一种指定 ics 的特定格式:
In [48]: t, m, k, x0, v0 = symbols('t, m, k, x0, v0')
In [49]: x = Function('x')(t)
In [50]: ac = x.diff(t, t)
In [51]: eos = Eq(m*ac, -k*x)
In [52]: dsolve(eos, x)
Out[52]:
_____ _____
╱ -k ╱ -k
-t⋅ ╱ ─── t⋅ ╱ ───
╲╱ m ╲╱ m
x(t) = C₁⋅ℯ + C₂⋅ℯ
In [54]: dsolve(eos, x, ics={x.subs(t, 0):x0, x.diff(t).subs(t, 0):v0})
Out[54]:
_____ _____
╱ -k ╱ -k
⎛ _____⎞ -t⋅ ╱ ─── ⎛ _____⎞ t⋅ ╱ ───
⎜ ╱ -k ⎟ ╲╱ m ⎜ ╱ -k ⎟ ╲╱ m
⎜-v₀ + x₀⋅ ╱ ─── ⎟⋅ℯ ⎜v₀ + x₀⋅ ╱ ─── ⎟⋅ℯ
⎝ ╲╱ m ⎠ ⎝ ╲╱ m ⎠
x(t) = ────────────────────────────────── + ────────────────────────────────
_____ _____
╱ -k ╱ -k
2⋅ ╱ ─── 2⋅ ╱ ───
╲╱ m ╲╱ m