numpy Sympy能用事例计算定积分吗?

bxgwgixi  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(80)

这是一个热方程积分问题。
所以我们有u(x,0),我们想要积分的初始条件,即:
1.x,当0 <= x <= 10
1.20-x,当10 <= x <= 20
现在,问题是,如果我想计算u(x,0)从0到20的积分,如果我们用手,它应该是:int_{0}^{10} x dx + int_{10}^{20} (20-x) dx
使用Python的SymPy代码,这是我可以创建的,非常手动(u(x,0)从0到20的积分由函数g表示):

import numpy as np
import sympy as sm
from sympy import *
from spb import *

x = sm.symbols("x")
t = sm.symbols("t")
n = sm.symbols("n", integer=True)

L = 20
f1 = (2/L)*x*sin(n*np.pi*x/20)
f2 = (2/L)*(20-x)*sin(n*np.pi*x/20)
fint1 = sm.integrate(f1,(x,0,10))
fint2 = sm.integrate(f2,(x,10,20))

D = 0.475
g = (fint1+fint2)*sin(n*np.pi*x/20)*exp(-(n**2)*(np.pi**2)*D*t/400).nsimplify()

是否有SymPy'技术的集成这种情况下,所以我不需要手动写fint1fint2,.?

cnh2zyt3

cnh2zyt31#

你可以使用Piecewise来实现:

In [8]: f = (S(2)/L)*sin(n*pi*x/20)*Piecewise((x, (0 <= x) & (x <= 10)), (20-x, (10 < x) & (x <= 20)))

In [9]: f
Out[9]: 
⎛⎧  x     for x ≥ 0 ∧ x ≤ 10 ⎞    ⎛π⋅n⋅x⎞
⎜⎨                           ⎟⋅sin⎜─────⎟
⎝⎩20 - x  for x ≤ 20 ∧ x > 10⎠    ⎝ 20  ⎠
─────────────────────────────────────────
                   10                    

In [10]: piecewise_fold(f)
Out[10]: 
⎧        ⎛π⋅n⋅x⎞                         
⎪   x⋅sin⎜─────⎟                         
⎪        ⎝ 20  ⎠                         
⎪   ────────────      for x ≥ 0 ∧ x ≤ 10 
⎪        10                              
⎨                                        
⎪            ⎛π⋅n⋅x⎞                     
⎪(20 - x)⋅sin⎜─────⎟                     
⎪            ⎝ 20  ⎠                     
⎪───────────────────  for x ≤ 20 ∧ x > 10
⎩        10

现在,您可以对分段表达式进行一次积分:

In [11]: integrate(f, (x, 0, 20))
Out[11]: 
⎧      ⎛π⋅n⎞           
⎪80⋅sin⎜───⎟           
⎪      ⎝ 2 ⎠           
⎪───────────  for n ≠ 0
⎨    2  2              
⎪   π ⋅n               
⎪                      
⎪     0       otherwise
⎩

相关问题