用于计算积分的程序中的错误

时间:2012-10-20 12:05:59

标签: 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) :
    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) 

2 个答案:

答案 0 :(得分:6)

您正在阅读x1,将其转换为int(读取:丢弃信息),然后在每次迭代时将其转换回浮点数。丢失的信息不会再出现。

z=(x2-x1)/N

因为你的值是整数,所以它将执行整数除法,即如果N> (x2 - x1),z将为零。由于您总是希望选择较大的Nz始终为零。

因此,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()的另一个问题是,step参数必须是整数。

您可以轻松创建自己的范围功能:

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 

答案 1 :(得分:2)

  • 允许x1x2,因此步长z是浮动的。
  • 而不是for - 循环,while - 循环可能更容易。

x1 = float(raw_input ('Δωστε το χ1 οπου αρχιζει η μετρηση του ολοκληρωματος \n ')) #greek letters
x2 = float(raw_input ('Δωστε χ2 οπου θελετε να ολοκληρωνεται η μετρηση \n '))
N = int(raw_input('Δωστε τον αριθμο n που θα ειναι το πληθος \n των τραπεζιων που θα χρησιμοπιουνται στη προσσεγγιση  \n '))
z = (x2-x1)/N
x = x1
while x < x2:
    print (z*(f(x)+f(x+z))/2)
    x += z