Python积分计算器不打印值

2024-04-25 00:39:04 发布

您现在位置: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, 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)不是整数。如果是这样的话,我怎么能在计算器中输入任何函数后仍然得到一个值呢


Tags: of函数fromimportinputvaluefunction计算器
1条回答
网友
1楼 · 发布于 2024-04-25 00:39:04

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

  • 内{{CD1}},您使用的是局部变量^ {< CD2> },但在{{CD3}}内,您认为它是全局^ {< CD2}}(但使用了本地,这是您想要的,只打印^ {< CD3> }内的{{CD2}})。作为f(x)中的全局变量和参数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, 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))

从{}集成到{}的{}的一些输出在{}扩展。分析结果为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

您可以使用^{} 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))

相关问题 更多 >