【问题标题】:Python integral calculator doesn't print a valuePython积分计算器不打印值
【发布时间】:2020-12-28 21:54:21
【问题描述】:

我制作了一个计算器,可以将任何给定函数近似为输入。他们后来我想让它计算一个积分,但是写完之后:

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, x, x0, 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, a, b))

我想,这是因为我的输入是一个字符串。但是我不能选择我的输入为整数,因为exp(-x**2) 不是整数。如果是这样,我怎样才能在我的计算器中输入任何函数并仍然得到一个值?

【问题讨论】:

  • 你需要将字符串映射到一个函数来执行。如果您想输入'exp(-x**2)' 作为字符串,您还需要将其解析为要执行的内容
  • 为什么要设置value=0 和下一行value=2?为什么Nabintegrate的参数,而不是functionx0n。我更喜欢使用 all 作为参数,或者不使用它们。
  • 为什么同时使用泰勒多项式逼近和中点逼近? 要么 直接对原始函数使用中点规则 精确/分析地积分泰勒多项式会更好吗?

标签: python integration taylor-series


【解决方案1】:

您的代码中存在一些重大问题:

  • integrate 内部,您使用的是局部变量n,但在f(x) 内部,您认为它是全局变量n(但使用了本地变量,这是您想要的,只需打印nf(x)) 内。 x 作为f(x) 中的全局变量和参数也是如此。如果您想在同一范围内同时使用全局变量和局部变量,请不要使用相同的名称。
  • f(x) 的返回值是 sympy 表达式,而不是单个值,这就是为什么你会得到你得到的输出。

经过一些重构并使用subsremoveO

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, x0, n, N, a, b): # using the approach with all variables as parameters
    taylor = series(function, x, x0, 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, x0, n, N, a, b))

x**2 的一些输出从 x=0 集成到 x=2 扩展为 x=1。解析结果为8/3=2.6666666...

x**2, 1, 0, 5, 0, 2 => 2.0 # constant approximation
x**2, 1, 1, 5, 0, 2 => 2.0 # linear approximation
x**2, 1, 2, 5, 0, 2 => 2.64 # quadratic approximation - exact function
x**2, 1, 2, 10, 0, 2 => 2.66
x**2, 1, 2, 100, 0, 2 => 2.6666
x**2, 1, 2, 1000, 0, 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, x0, n, N, a, b):
    taylor = series(function, x, x0, 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))

【讨论】:

  • 谢谢,唯一的问题是,假设我在exp(-x**2)中绘制函数,它是waaay off,这是为什么?
  • 请提供其他参数。正如我在 OP 下面问的那样,你做了 两个 近似值,每一个都会产生一些错误。使用泰勒多项式逼近或中点规则,您应该会得到更好的结果
  • 是的,我想通了。当用 1000 度和 1000 和来近似函数时,它会更准确。我将尝试实现lambdify 以加快计算速度。谢谢!
  • 我仍然很好奇你为什么使用 both 泰勒多项式 中点规则。开始选择任一泰勒多项式的精确计算原始函数上使用中点规则。从 1000x1000 的问题到 1000000x1 的问题,使用相同的资源可以获得更好的结果
  • 我这样做只是因为它是为了一个学校项目,其中两种方法都必须代表。如果不是这种情况,我完全同意你的看法,无论是使用泰勒展开式还是单独使用中点规则都会更有利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 2012-01-31
  • 2020-01-29
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多