如何解决Python积分计算器不显示值
我制作了一个计算器,可以近似任何给定的函数作为输入。他们后来我想让它计算一个积分,但是在写完之后:
function = str(input("The function that must be expanded and integrated: "))
它不打印数字,而是一个值。这是我的代码:
from sympy.functions import sin,cos,tan
from sympy.abc import x
from sympy import *
from sympy import series
from math import *
function = str(input("The function that must be expanded and integrated: "))
x0 = int(input("Point of development: "))
n = int(input("Amount of expressions: "))
print(series(function,x,x0,n))
N = int(input("Amount of summs (Bigger number is more accurate but takes longer time): "))
a = int(input("Integrate from: "))
b = int(input("Integrate to: "))
# We will use the midpoint method to integrate the function
def integrate(N,a,b):
def f(x):
return series(function,n)
value=0
value=2
for n in range(1,N+1):
value += f(a+((n-(1/2))*((b-a)/N)))
value2 = ((b-a)/N)*value
return value2
print("...................")
print("Here is your answer: ")
print(integrate(N,b))
我认为是因为我的输入是字符串。但是我不能选择输入为整数,因为exp(-x**2)
不是整数。如果是这种情况,如何在计算器中输入任何函数并仍然获得值?
解决方法
您的代码中存在一些重大问题:
- 在
integrate
内,您正在使用局部变量n
,但是在f(x)
内,您认为它是全局变量n
(但是使用了局部变量,这就是只需在n
内打印f(x)
)。x
作为f(x)
中的全局变量和参数也是如此。如果要在同一范围内使用全局变量和局部变量,请不要使用相同的名称。 -
f(x)
的返回值是sympy
形式,而不是单个值,这就是为什么要获得所得到的输出的原因。
from sympy.functions import sin,cos,tan
from sympy.abc import x
from sympy import series
function = str(input("The function to be expanded and integrated: "))
x0 = int(input("Point of development: "))
n = 1 + int(input("Degree: "))
# input 0 -> n=1 -> constant (1 term,constant)
# input 1 -> n=2 -> linear (2 terms,constant + linear)
# input 2 -> n=3 -> quadratic (3 terms,constant + linear + quadratic)
# ...
print(series(function,x,x0,n))
N = int(input("Amount of summs (Bigger number is more accurate but takes longer time): "))
a = int(input("Integrate from: "))
b = int(input("Integrate to: "))
# We will use the midpoint method to integrate the function
def integrate(function,n,N,a,b): # using the approach with all variables as parameters
taylor = series(function,n) # the same expression for the function,create it once
taylor = taylor.removeO() # do not use O term (may corrups subs below)
dx = (b-a)/N # also computed just once
def f(v):
return taylor.subs(x,v) # taylor is expression,return value is float evaluated with substituted x by v
return dx * sum(f(a+(i+1/2)*dx) for i in range(N)) # simple sum function,can be rewriten using a for loop
print("...................")
print("Here is your answer: ")
print(integrate(function,b))
从x**2
到x=0
集成的x=2
的某些输出在x=1
处扩展。分析结果为8/3=2.6666666...
。
x**2,1,5,2 => 2.0 # constant approximation
x**2,2 => 2.0 # linear approximation
x**2,2,2 => 2.64 # quadratic approximation - exact function
x**2,10,2 => 2.66
x**2,100,2 => 2.6666
x**2,1000,2 => 2.666666
您可以使用lambdify
to "convert a SymPy expression into a function that allows for fast numeric evaluation"。对于N=1000
而言,提速非常重要。
from sympy.utilities.lambdify import lambdify
def integrate(function,b):
taylor = series(function,n)
taylor = lambdify(x,taylor.removeO()) # here
dx = (b-a)/N
def f(v):
return taylor(v) # here
return dx * sum(f(a+(i+1/2)*dx) for i in range(N))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。