def func(x):
return x*x*x - x*x + 2
# Prints root of func(x)
# with error of EPSILON
def bisection(a,b):
if (func(a) * func(b) >= 0):
print("You have not assumed right a and bn")
return
c = a
while ((b-a) >= 0.01):
# Find middle point
c = (a+b)/2
# Check if middle point is root
if (func(c) == 0.0):
break
# Decide the side to repeat the steps
if (func(c)*func(a) < 0):
b = c
else:
a = c
print("The value of root is : ","%.4f"%c)
在上面的代码中,我想从用户那里获取方程作为输入,这里我使用 x x x - x*x + 2,但我想从用户输入中获取一个方程而不是它并在函数 func(x( 上使用它
如果这些代码是出于学术目的,并且您不想涉及第三方库,那么 Python 中的eval()
函数就是为此而构建的。您可以创建一个函数,该函数计算字符串表达式expr
的值x
如下:
def func(expr, x):
return eval(expr)
input_expr = input('Enter an expression in x: ')
val = 5
print(func(input_expr, val))
输入: x*x*x- x*x + 2
输出:102
eval()
将传递给它的字符串视为右侧表达式并对其进行计算。因此,当用户输入字符串'x*x*x - x*x + 2'
传递给函数时,语句return eval('x*x*x - x*x + 2')
等效于return x*x*x-x*x+2
。
请注意,这意味着作用域中必须有一个变量x
,我们通过将 eval(( 函数包装在函数eval_expr()
中来处理该变量。
但是,如果用户输入类似y*y*y+y*y-2
的内容,因为y
未在作用域中声明,则会出现问题。如果您需要处理这种情况,则需要编写其他代码,通过将输入字符串中的任何字母字符替换为x
来转换输入字符串。
应该注意的是,eval
通常被认为是不安全的,如果这段代码不是出于学术目的并且需要安全,你应该考虑使用像 numexpr 或 pyparsing 这样的 python 库。 numexpr 应该相当易于使用,并且足以满足您的应用程序。
只需将其添加为参数:
def bisection(func, a, b):
if (func(a) * func(b) >= 0):
print("You have not assumed right a and bn")
return
c = a
while ((b-a) >= 0.01):
# Find middle point
c = (a+b)/2
# Check if middle point is root
if (func(c) == 0.0):
break
# Decide the side to repeat the steps
if (func(c)*func(a) < 0):
b = c
else:
a = c
print("The value of root is : ","%.4f"%c)