我有一个函数涉及从-10到10的双重积分x和-10到10 y,我在SciPy中使用内置的正交函数来做到这一点。但是,需要集成的确切功能需要用户输入。
该函数是A * cos(x + y),其中A需要是用户输入函数。
例如,有时函数是常数,A是2.因此,积分在x和y中都是2 * cos(x + y)-10到10。我希望用户在提示A时输入2。
但有时,用户可能希望A为sin(x)。所以积分将是sin(x)* cos(x + y)再次从-10到10。我希望用户在提示输入A时输入np.sin(x)。
或许用户可能需要A为np.pi * y * e ^(x / 3)。
当用户输入值时,A是一个字符串。我如何让它成为一段代码,如果用户输入np.sin(x),然后在正交的代码中,Python将其读作np.sin(x)* np.cos(x + Y)
如果用户输入错误(例如,他将np.sin拼错为np.sin)并且返回错误,我可以。
我写的内容如下:
import numpy as np
from scipy.integrate import dblquad
A = input('Enter your function here: ')
def function(x,y):
return A*(np.cos(x+y))
integral = dblquad(function, -10, 10, lambda x:-10, lambda x:10)
print integral
感谢给予的任何帮助。
答案 0 :(得分:2)
我建议使用以下方法,它不是万无一失的,但应该抓住大多数情况:
对用户的输入应用以下规则:
int
的数字:.
,在此.
上拆分
.
的左侧部分不是模块,则其无效输入。.
的右侧,然后将其修剪至最后(
partials
来调用它,然后将其余的公式链接起来。.
,请检查其中是否包含(
,并修剪为此(
。partials
来调用它。以下是一些代码:
import functools
import re
i = 'math.sin(12)'
try:
i = int(i)
except ValueError:
bits = i.split('.')
if len(bits) > 1:
module = bits[0]
callable = bits[1][:bits[1].rfind('(')]
args = re.search(r'\((.*?)\)', i).groups()[0]
if hasattr(module, callable):
f = functools.partial(getattr(module, callable), args)
在此之后,f
将是您可以调用的函数。但是这段代码存在一些问题:
它没有考虑所有情况,最突出的是如果用户输入没有模块的功能,你将不得不处理这部分。
它不处理复杂的嵌套函数调用。
希望您可以根据具体用例进行构建。
答案 1 :(得分:0)
我很确定你可以使用“eval”功能来实现这个目的。 https://docs.python.org/2/library/functions.html#eval
但是要小心,此函数会执行用户输入,这可能会带来安全风险。
编辑: 在您的函数中,用eval(A)替换A变量。假设这是一个有效的函数,这应该可行。