Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python积分计算器不';不要打印值_Python_Integration_Taylor Series - Fatal编程技术网

Python积分计算器不';不要打印值

Python积分计算器不';不要打印值,python,integration,taylor-series,Python,Integration,Taylor Series,我做了一个计算器,可以近似任何给定的函数作为输入。他们后来想用它来计算一个积分,但写下: 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 symp

我做了一个计算器,可以近似任何给定的函数作为输入。他们后来想用它来计算一个积分,但写下:

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)
不是整数。如果是这样的话,我如何在计算器中输入任何函数并仍然获得值?

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

  • 内部代码>集成,您使用的是局部变量<代码> n>代码>,但是在 f(x)< /C> >中,您认为它是全局<代码> n>代码>(但是使用了本地,这就是您想要的,只是在代码< f(x)< /> >内打印<代码> n<代码>。这同样适用于
    x
    ,作为
    f(x)
    中的全局变量和参数。如果要在同一范围内使用全局变量和局部变量,请不要使用相同的名称
  • f(x)
    的返回值是一个
    sympy
    epxpression,而不是一个单独的值,这就是为什么您得到的是输出
经过一些重构并使用和:

从sympy.functions导入sin、cos、tan
从sympy.abc导入x
从sympy导入系列
function=str(输入(“要扩展和集成的函数:”)
x0=int(输入(“开发点:”)
n=1+int(输入(“度:”)
#输入0->n=1->常数(1项,常数)
#输入1->n=2->线性(2项,常数+线性)
#输入2->n=3->二次型(3项,常数+线性+二次型)
# ...
打印(系列(功能,x,x0,n))
N=int(输入(“总和的数量(更大的数字更准确,但需要更长的时间):”)
a=int(输入(“集成自:”)
b=int(输入(“集成到:”)
#我们将使用中点法对函数进行积分
def积分(函数,x0,n,n,a,b):#使用所有变量作为参数的方法
泰勒=级数(函数,x,x0,n)#函数的相同表达式,创建一次
taylor=taylor.removeO()#不要使用O术语(可能会在下面更正)
dx=(b-a)/N#也只计算了一次
def f(v):
return taylor.subs(x,v)#taylor是表达式,返回值是用v代替x进行浮点计算的
对于范围(N)内的i返回dx*sum(f(a+(i+1/2)*dx)#简单求和函数,可以使用for循环重写
印刷品(……)
打印(“这是你的答案:”)
打印(集成(函数,x0,n,n,a,b))
x**2
的一些输出从
x=0
集成到
x=2
x=1
处展开。分析结果为
8/3=2.66666…

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
你可以用。对于
N=1000
的情况,加速效果显著

从sympy.utilities.lambdify导入lambdify
def集成(函数x0,n,n,a,b):
泰勒=级数(函数x,x0,n)
taylor=lambdify(x,taylor.removeO())#这里
dx=(b-a)/N
def f(v):
返回泰勒(v)#这里
对于范围(N)内的i,返回dx*和(f(a+(i+1/2)*dx)

您需要将字符串映射到要执行的函数。如果您想将
'exp(-x**2)
作为字符串输入,您还需要将其解析为stuff,以确定您为什么设置
value=0
,并在下一行
value=2
?为什么
N
a
b
integrate
的参数,而不是
函数
x0
N
。我更喜欢威瑟尔使用全部作为参数,或者不使用任何参数。为什么同时使用泰勒多项式近似和中点近似?直接对原始函数使用中点规则或精确/解析地积分泰勒多项式不是更好吗?谢谢,唯一的问题是,假设我在
exp(-x**2)
中绘制函数,它是关闭的,为什么?请提供其他参数。正如我在下面所问的,你们做了两个近似,每一个都会产生一些误差。无论是使用泰勒多项式逼近法还是中点法则,你都会得到更好的结果是的,我找到了。当用1000度和1000和近似函数时,它更精确。我将尝试实现lambdify以加速计算。非常感谢。我仍然很好奇为什么你们同时使用泰勒多项式和中点法则。开始选择泰勒多项式的精确求值或对原始函数使用中点规则。从1000x1000个问题到10000000001个问题,使用相同的资源可以获得更好的结果。我之所以这样做,是因为这是一个学校项目,其中两种方法都必须表示出来。如果不是这样的话,我完全同意你的看法,要么使用泰勒展开法,要么使用中点法则。