- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个简单的二阶 ODE 的齐次解,当我尝试使用 Sympy 求解初始值时,它返回相同的解。它应该替代 y(0) 和 y'(0) 并产生没有常量的解,但事实并非如此。这是设置方程的代码(这是一个 Spring 平衡方程,k = Spring 常数,m = 质量)。抱歉,我在其他地方使用了一些多余的符号。
%matplotlib inline
from sympy import *
m,k, x,t,s,T, omega,A,B = symbols('m k x t s T omega A B',float=True)
a = symbols('a', positive=True)
f,y,g,H,delta,S=symbols('f y g H delta S',cls=Function)
Eq1 = Eq(m*diff(y(t),t,2)+k*y(t))
Eq1
结果是(正确):$y{\left (t\right )} = C_{1} e^{- t\sqrt{-\frac{k}{m}}} + C_{2} e^{t\sqrt{-\frac {k}{m}}}$
y(t)=C1e^(−t√(−k/m))+C2e^(t√(−km)), 也有 y_n = c1.cos(√(−k/m)t )+c2.sin(√(−k/m)t).
当解析求解该方程,并使用 omega = sqrt(-k/m) 转换为使用正弦和余弦的解时,则 c1 = y(0) 和 c2 = y'(0)/omega。因此,虽然解决方案部分涉及复数,但 dsolve 当然会像上面那样简单地返回原始齐次方程。我在 y(0) 和 y'(0) 处评估 ODE 的代码是:
Eq1_soln_IVP =dsolve(Eq1,y(t),x0=0, ics={y(0): a, y(t).diff(t).subs(t, 0): a})
我明白 dsolve 可能无法分析地处理这个 IVP,但如果这是基于它的其他能力,我会感到惊讶。对于如何解决此问题以及其他解析二阶问题的任何帮助,我们将不胜感激。问题的核心在于:
ics={y(0): a, y(t).diff(t).subs(t, 0): a}
所以我尝试过的解决方案是:
#Create IVP for y(0)
expr = Eq(Eq1_soln_IVP.rhs.subs(sqrt(-k/m),I*omega),y(0))
#Create IVP for y'(0)
expr2 = Eq(diff(y(t),t).subs(t,0),expr.lhs.diff(t))
#Maps all free variables and solves for each where t = 0.
solve([expr.subs(t,0),expr2.subs(t,0)])
虽然它是“一个”解决方案,但这似乎是一种寻找 y(t) = y(0)cos(omega*t - phi) 的非常复杂的方法...它回答了有关此求解器某些局限性的隐含问题以及关于 ics arg 如何解决的直接问题。谢谢。
最佳答案
dsolve()
中的参数 ics
实际上不起作用 ( Issue 4720 ),因此您必须手动进行替换。你可以试试:
from IPython.display import display
import sympy as sy
sy.init_printing() # LaTeX-like pretty printing for IPython
t = sy.Symbol("t", real=True)
m, k = sy.symbols('m k', real=True) # gives C_1 Exp() + C_2 Exp() solution
# m, k = sy.symbols('m k', positive=True) # gives C_1 sin() + C_2 cos() sol.
a0, b0 = sy.symbols('a0, b0', real=True)
y = sy.Function('y')
Eq1 = sy.Eq(m*sy.diff(y(t), t, 2) + k*y(t))
print("ODE:")
display(Eq1)
print("Generic solution:")
y_sl0 = sy.dsolve(Eq1, y(t)).rhs # take only right hand side
display(sy.Eq(y(t), y_sl0))
# Initial conditions:
cnd0 = sy.Eq(y_sl0.subs(t, 0), a0) # y(0) = a0
cnd1 = sy.Eq(y_sl0.diff(t).subs(t, 0), b0) # y'(0) = b0
# Solve for C1, C2:
C1, C2 = sy.symbols("C1, C2") # generic constants
C1C2_sl = sy.solve([cnd0, cnd1], (C1, C2))
# Substitute back into solution:
y_sl1 = sy.simplify(y_sl0.subs(C1C2_sl))
print("Solution with initial conditions:")
display(sy.Eq(y(t), y_sl1))
关于python - Sympy 二阶颂歌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34735660/
在做 Ch06 的练习 6.5 时 |在 Middlebrook 博士的 D-OA 方法中,我尝试制作传递函数的波德图: bodeplot[s/100+100/s*(1+10/s)](wolframa
我正在尝试做这样的事情 编辑 - 整个查询。 SELECT * FROM ride WHERE ( SELECT COUNT(*) FROM ( SELECT DISTINCT
我尝试求解简单的数值方程 - 没有源的线性波动方程:utt = v2 uxx 其中 v - 波速。 我使用初始条件: u(x, 0) = sin(x) ux(x, 0) = -v * sin(x) 对
我正在尝试使用 C++ 求解 4 个二阶多项式方程组。解决该系统的最快方法是什么?如果可能,您能否链接或编写一些伪代码来解释它?我知道涉及 Groebners 基础或 QR 分解的解决方案,但我找不到
我在 Checkmarx 中遇到错误。 Method abortJob at line 209 of XXX/classes/Monitoring.cls gets user inputfrom th
对于二阶 ODE(python 中的 dopri5 方法),下面的代码总是会导致错误:C:\Users\MY\Anaconda3\lib\site-packages\scipy\integrate\_
重要更新:我已经找到答案并将它们放在这个简单的开源库中:http://bartolsthoorn.github.com/NVDSP/检查一下,如果您在 IOS 中遇到音频过滤器问题,它可能会为您节省不
我是一名优秀的程序员,十分优秀!