Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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_Math - Fatal编程技术网

Python 积分计算程序中的错误

Python 积分计算程序中的错误,python,math,Python,Math,我试图用积分来计算图的面积 用户应该给我3个数字: x1,x2–积分的边界 N是程序将分割函数的数量 然而,我总是得到错误的结果 我面临的第一个困难是范围只接受整数 另外z=(x2-x1)/N如果我尝试将其设为浮点,我不能将其设为后一步,也不能将其设为浮点,因为它接近于零,因此Python向我显示了一个错误,即该步为零 还有,我如何总结(z*(f(I)+f(I+z)/2) 这是我的密码: # -*- coding: UTF-8 -*- import math def f(x) :

我试图用积分来计算图的面积

用户应该给我3个数字:

  • x1,x2–积分的边界
  • N是程序将分割函数的数量
然而,我总是得到错误的结果

我面临的第一个困难是范围只接受整数

另外
z=(x2-x1)/N
如果我尝试将其设为浮点,我不能将其设为后一步,也不能将其设为浮点,因为它接近于零,因此Python向我显示了一个错误,即该步为零

还有,我如何总结
(z*(f(I)+f(I+z)/2)

这是我的密码:

# -*- coding: UTF-8 -*-
import math

def f(x) :
    y = (-1/6.0)*(x-1)*(x-2)*(x+2)*(x-4)
    return y 
x1=int(raw_input ('Δωστε το χ1 οπου αρχιζει η μετρηση του ολοκληρωματος \n ')) #greek letters
x2=int(raw_input ('Δωστε χ2 οπου θελετε να ολοκληρωνεται η μετρηση \n '))
N=int(raw_input('Δωστε τον αριθμο n που θα ειναι το πληθος \n των τραπεζιων που θα χρησιμοπιουνται στη προσσεγγιση  \n '))
z=(x2-x1)/N
for i in range(x1,x2,z):
    z=float(z)
    x1=float(x1)
    x2=float(x2)
    print (z*(f(i)+f(i+z))/2) 
  • x1
    x2
    ,因此步长
    z
    是浮动的
  • 这里的
    while
    -循环可能更容易,而不是
    for
    -循环

x1=float(原始_输入('Δωστετοχ1οποΓαρχιζειηημετρησητΓλοκληρωατοςn')希腊字母
x2=浮点(原始_输入(‘Δωστεχ2οποⅤθελετεναολετκληρωνεταιημετρηση\n’)
N=int(原始输入(‘Δω∑τετναριθNποθαεναειτοπληθθοτρρNτⅤτταππθθθθηησ∑πππππθθθθηηηρθθρθθθθθρθθθρθθθθθθθθθθθθθθθθθθθθθθ
z=(x2-x1)/N
x=x1
当x
您正在阅读
x1
,将其转换为
int
(读取:丢弃信息),然后在每次迭代时将其转换回浮点。丢失的信息将不会再次出现

z=(x2-x1)/N
因为您的值是整数,它将执行整数除法,即,如果N>(x2-x1),
z
将为零。而且,由于您总是希望选择一个较大的
N
z
将始终为零

因此,
range()
无法工作

您需要做的是将输入读取为浮点数:

number = float(raw_input("Please enter a number: "))

请注意,重复应用
float()
不会做任何有用的事情。因此,不需要此代码:

for ...
    z=float(z)
    x1=float(x1)
    x2=float(x2)

还有,我如何总结(z*(f(i)+f(i+z)/2)

你不能把它缩短,因为
f()
不是一个线性函数


range()
的另一点是,步长参数必须是整数

您可以通过以下方式轻松创建自己的范围函数:

def frange(start, stop, steps):
    x = start
    difference = float(stop - start)
    for step in range(0, steps):
        next_x = start + difference * (1 + step) / steps
        yield x, next_x - x
        x = next_x

工作代码
编写
range
的浮点实现不是一个好主意,因为浮点错误意味着
stop
端点(近似值)是否包含在内是不可预测的。例如,在您的实现中,
len(list(frange(0,1,1/7.))
len(list(frange(0,1,1/8.))
give
8
在我的机器上。最好保持基于int的范围,并从中计算当前的
x
。@MarkDickinson这是一个很好的观点,但我不确定它是否有那么大的相关性,毕竟,使用
1/7th
进行积分的Δx太大了,而且随着Δx变小,可能会出现一个错误应该走了。既然你是一名数学家,也许你可以就这一点的重要性发表一些比我少的声明。但是,我很快就会实现这一点。我不认为偏离一个错误的可能性会消失:事实上,你使用的步数越多,加法的预期累积误差就越大(每一步一个)。将该错误视为大致正态分布(这可能是合理的,也可能不是合理的),对于大量的步骤,我希望在大约一半的时间内得到一个额外的不需要的点。建议的替换:对于范围(N)内的I使用
,然后在
sum+=…
行之前
x=x1+i*delta_x
。@MarkDickinson,但错误是否仍会以这种方式累积?有关更新版本,请参阅我的编辑。
def frange(start, stop, steps):
    x = start
    difference = float(stop - start)
    for step in range(0, steps):
        next_x = start + difference * (1 + step) / steps
        yield x, next_x - x
        x = next_x
# -*- coding: UTF-8 -*-
import math

def f(x) :
    y = (-1/6.0)*(x-1)*(x-2)*(x+2)*(x-4)
    return y 
x1 = float(raw_input ('Δωστε το χ1 οπου αρχιζει η μετρηση του ολοκληρωματος \n ')) #greek letters
x2 = float(raw_input ('Δωστε χ2 οπου θελετε να ολοκληρωνεται η μετρηση \n '))
N = int(raw_input('Δωστε τον αριθμο n που θα ειναι το πληθος \n των τραπεζιων που θα χρησιμοπιουνται στη προσσεγγιση  \n '))
result = 0
for x, delta_x in frange(x1, x2, N):
    result += delta_x * (f(x)+f(x+delta_x)) / 2
print result