微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在编写一个接受用户输入以区分功能的程序

如何解决我正在编写一个接受用户输入以区分功能的程序

为了找到函数的最大值和最小值,我正在编写一个程序,该程序接受用户输入的多项式并找到导数 = 0 的位置。

from sympy import Symbol,Derivative
from sympy import symbols,Eq,solve
import sympy as sy
import numpy as np 
import math 



x= Symbol('x',real = True)
function= x**4 +7*x**2 +8

deriv= Derivative(function,x)
yprime = deriv.doit()
y = symbols('x')
eq1 = Eq(yprime,0)
sol = solve(eq1,)

上面的代码能够求导并找到解决方案的唯一原因是因为系数和指数是整数。如果我要求用户输入{e.g.,function = input("What is your function:")},那么整个事情将变成一个字符串,SymPy 不能取导数。

是否可以将系数和指数转换为整数并将函数的其余部分保留为字符串以便我可以取导数?

解决方法

如果您的方程可以任意复杂,您可能需要使用 eval 从 Python 语法中解析它。现在,将 eval 用于不受信任的用户输入通常是不安全的,但回复 input() 提示的用户可能是受信任的(因为他们通常坐在运行代码的计算机前)。

所以一种选择是:

function = eval(input("What is your function: "))

如果放在 x 定义的正下方,它将允许在等式中使用该变量。您还可以提供一个命名空间供 eval 使用,而不是让它使用您函数的本地命名空间(例如 function = eval(input(...),{'x': Symbol('x',real=True)}))。

如果您的问题空间更有限,并且您只需要处理具有整数系数的多项式的方程,那么您可以编写自己的逻辑,以更简化的形式输入方程。例如,您可以循环,按顺序要求系数(可能从最低指数到最高指数)。尝试这样的事情:

import itertools

from sympy import Symbol

x = Symbol('x',real = True)

function = 0
for exponent in itertools.count():
    coef = input(f"Enter coefficient for x**{exponent} (or give an empty value to be done): ")
    if not coef:
        break
    function += int(coef) * x**exponent
    print("Polynomial so far:",function)

对于问题中的示例方程,您需要输入 80701,最后输入一个空输入。

,

更好的做法是将您的字符串转换为 SymPy 表达式。只要用户使用 SymPy/python 语法,sympyify 就会为您转换:

>>> from sympy import sympify,solve
>>> user='3*x**2-1'
>>> eq = sympify(user)
>>> x = eq.free_symbols.pop()  # assuming there is 1 symbol
>>> solve(eq.diff(x))
[0]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。