如何使用 SymPy 在 Python 中找到导数

How to find derivative in Python using SymPy

我想找到用户输入的某个函数的导数。

x = np.linspace(-5,5)

print('Options are:')
print('1. y = x')
print('2. y = ax^2')
print('3. y = k(x-a)(x-b)')
print('4. y = k(x-a)(x-b)(x-c)')

n = int(input('Your option is: '))

if n == 1:
    func = x
    plt.plot(x,func)
    n = input('Do you wanna find its derivative? (Y/N)')
    if n == 'Y':
        print('Derivative is 1')
    else:
        print('Done')

elif n == 2:
    a = int(input('Enter a value for a: '))
    func = a*x**2
    plt.plot(x,func)
    n = input('Do you wanna find its derivative? (Y/N)')
    if n == 'Y':
        x = sp.Symbol('x')
        print(sp.diff(func,x))
    else:
        print('Done')

当 n == 2 时, 我需要用户为 ax^2 函数输入 'a' 值。 然后代码将绘制图形 ax^2。 然后继续询问用户是否想要函数的导数。 在这部分我很困惑,因为我上面使用的语法,它不显示导数,而是显示如下所示的 0 列表。

1. y = x
2. y = ax^2
3. y = k(x-a)(x-b)
4. y = k(x-a)(x-b)(x-c)
Your option is: 2
Enter a value for a: 3
Do you wanna find its derivative? (Y/N)Y
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我该如何解决这个问题?

问题发生在您设置func = a*x**2的那一行。如您所见,x 是一个向量(还不是符号)。这意味着 func 也是一个向量。当 func 传递给 sp.diff 时,它不再是一个函数,而是一个导致该问题的向量。

因此,您需要将 sp.diff 行更改为:

sp.diff(a*x**2, x)
# 6*x (when a=3)

旁注

x 同时用作 变量 符号 是一个非常糟糕的主意。很乱,以后会导致很多问题。

您需要在定义函数 func 之前定义符号 x。对于绘图,您可以使用 SymPy 的绘图模块。以下是一个可能的解决方案。

import sympy as sp
import numpy as np
from sympy.plotting import plot

x = sp.Symbol('x')

print('Options are:')
print('1. y = x')
print('2. y = ax^2')
print('3. y = k(x-a)(x-b)')
print('4. y = k(x-a)(x-b)(x-c)')

n = int(input('Your option is: '))

if n == 1:
    func = x
    plot(func)

    n = input('Do you wanna find its derivative? (Y/N)')
    if n == 'Y':
        print('Derivative is 1')
    else:
        print('Done')

elif n == 2:
    a = int(input('Enter a value for a: '))
    func = a*x**2
    plot(func)
    n = input('Do you wanna find its derivative? (Y/N)')
    if n == 'Y':
        print(sp.diff(func,x))
    else:
        print('Done')