numpy 使用SymPy和Python分段积分生成不同的3D线框图

bwleehnv  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(88)

我试图使用piecewise来集成在某个域上发生变化的功能。
3D线框图的结果(使用spb)与使用逐个计算积分的手动方法时不同。正确的绘图是使用手动方式的绘图。
如果你想知道,为什么有从110的for循环,它是为了取代从1到无穷大的总和,因为它可以表示1到无穷大的总和(热方程中的傅立叶级数)。它最终会收敛。
这是正确的,正确的,

所以,在这个分段MWE中我的错在哪里:

# https://stackoverflow.com/questions/77259323/can-sympy-compute-definite-integral-by-cases/77259532#77259532
# https://stackoverflow.com/questions/77258199/how-to-replace-the-variable-from-sympy-computation-so-it-can-be-plotted-with-mat/77258592#77258592
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
D = 0.475
f = (S(2)/L)*sin(n*np.pi*x/20)*Piecewise((x, (0 <= x) & (x <= 10)), (20-x, (10 < x) & (x <= 20)))
print('The function u(x,0) : ')
print('')
sm.pretty_print(f)
print('')
print('')
print(piecewise_fold(f))

fint = integrate(f, (x, 0, 20))
g = fint*exp(-(n**2)*(np.pi**2)*D*t/400).nsimplify()
print('')
print('')
sm.pretty_print(fint)
print('')
print('')

s3 = 0
for c in range(10):
    s3 += g.subs({n:c})

print('')
print('The function u(x,t) : ')
print('')
sm.pretty_print(s3)

plot3d(
    s3, (x, 0, 20), (t, 0, 10), {"alpha": 0}, # hide the surface
    wireframe=True, wf_n1=20, wf_n2=10,
    wf_rendering_kw={"color": "tab:blue"}, # optional step to customize the wireframe lines
    backend=MB, zlabel="$u(x,t)$", title="One Dimensional Heat Equation"
)

该代码具有正确的绘图,但仍然与手动方式集成,而不是使用piecewise

# https://stackoverflow.com/questions/77258199/how-to-replace-the-variable-from-sympy-computation-so-it-can-be-plotted-with-mat/77258592#77258592
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()
s = 0
for c in range(10):
    s += g.subs({n:c})
    print(s)

print('')
print('The function u(x,t) : ')
print('')
sm.pretty_print(s)
print('')
print('')

plot3d(
    s, (x, 0, 20), (t, 0, 10), {"alpha": 0}, # hide the surface
    wireframe=True, wf_n1=20, wf_n2=10,
    wf_rendering_kw={"color": "tab:blue"}, # optional step to customize the wireframe lines
    backend=MB, zlabel="$u(x,t)$", title="One Dimensional Heat Equation"
)
ua4mk5z4

ua4mk5z41#

差异来自于此:

g = fint*exp(-(n**2)*(np.pi**2)*D*t/400).nsimplify()

还有这个

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

请注意,在第二个中,您乘以了sin(n*np.pi*x/20),而第一个中缺少该乘数。
另外,使用SymPy时,始终使用SymPy对象。因此,在代码中,您希望将np.pi替换为pi。它也使代码更容易阅读。

相关问题