如何使用此函数绘制0?

2024-03-29 14:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我得到了这段代码,我在函数n=1,5,10中实现了绘图。 现在我也应该画出零。如果我在(0,1,5,10)中输入n_val的,不幸的是,我得到了错误x和y必须具有相同的第一维度,但具有形状(1000,)和(1,)。谢谢你帮助我

x = sp.symbols("x")
k = sp.symbols("k")
n = sp.symbols("n")
b = sp.Sum(((-1) ** k) * (x ** (2 * k + 1)) / sp.factorial(((2 * k + 1))), (k, 0, n))
c = sp.diff(b,x, 1)
a = sp.simplify(c)

for n_val in (1,5,10):
    a_np = sp.lambdify(x, a.subs(n, n_val).doit())
    x_vals = np.linspace(0, 10, 1000)        
    plt.plot(x_vals, a_np(x_vals), label=n_val)

plt.ylim(-2, 2)
plt.margins(x=0)
plt.legend(title='n', bbox_to_anchor=[1.02, 1.02], loc='upper left')
plt.tight_layout()
plt.show()

Tags: 函数代码绘图错误npdiffpltval
1条回答
网友
1楼 · 发布于 2024-03-29 14:36:58

您可以使用Sympy: lambdify such that operations on arrays always result in arrays, also for constants?的方法,测试函数是否为常量,并在这种情况下创建常量numpy函数:

import sympy as sp
import numpy as np
import matplotlib.pyplot as plt

def np_lambdify(varname, func):
    lamb = sp.lambdify(varname, func, modules=['numpy'])
    if func.is_constant():
        return lambda t: np.full_like(t, lamb(t))
    else:
        return lambda t: lamb(np.array(t))

x = sp.symbols("x")
k = sp.symbols("k")
n = sp.symbols("n")
b = sp.Sum(((-1) ** k) * (x ** (2 * k + 1)) / sp.factorial(((2 * k + 1))), (k, 0, n))
c = sp.diff(b, x, 1)
a = sp.simplify(c)

for n_val in (0, 1, 5, 10):
    a_np = np_lambdify(x, a.subs(n, n_val).doit())
    x_vals = np.linspace(0, 10, 1000)
    plt.plot(x_vals, a_np(x_vals), label=n_val)

plt.ylim(-2, 2)
plt.margins(x=0)
plt.legend(title='n', bbox_to_anchor=[1.02, 1.02], loc='upper left')
plt.tight_layout()
plt.show()

lambdify  of constant sympy function

相关问题 更多 >