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

Gio*_*is3 5 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) 
Run Code Online (Sandbox Code Playgroud)

pha*_*t0m 6

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

z=(x2-x1)/N
Run Code Online (Sandbox Code Playgroud)

因为你的值是整数,所以它将执行整数除法,即如果N>(x2 - x1),z则为零.而且既然你总是想选择一个大的N,z总是零.

因此,range()不能不工作.

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

number = float(raw_input("Please enter a number: "))
Run Code Online (Sandbox Code Playgroud)

请注意,float()重复应用不会有用.因此,此代码不是必需的:

for ...
    z=float(z)
    x1=float(x1)
    x2=float(x2)
Run Code Online (Sandbox Code Playgroud)

另外我如何总结(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
Run Code Online (Sandbox Code Playgroud)

工作代码

# -*- 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 
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 2

    \n
  • x1x2因此步长z为浮点数。
  • \n
  • for在这里,使用 -loop代替while-loop 可能更容易。
  • \n
\n\n
\n\n
x1 = float(raw_input ('\xce\x94\xcf\x89\xcf\x83\xcf\x84\xce\xb5 \xcf\x84\xce\xbf \xcf\x871 \xce\xbf\xcf\x80\xce\xbf\xcf\x85 \xce\xb1\xcf\x81\xcf\x87\xce\xb9\xce\xb6\xce\xb5\xce\xb9 \xce\xb7 \xce\xbc\xce\xb5\xcf\x84\xcf\x81\xce\xb7\xcf\x83\xce\xb7 \xcf\x84\xce\xbf\xcf\x85 \xce\xbf\xce\xbb\xce\xbf\xce\xba\xce\xbb\xce\xb7\xcf\x81\xcf\x89\xce\xbc\xce\xb1\xcf\x84\xce\xbf\xcf\x82 \\n ')) #greek letters\nx2 = float(raw_input ('\xce\x94\xcf\x89\xcf\x83\xcf\x84\xce\xb5 \xcf\x872 \xce\xbf\xcf\x80\xce\xbf\xcf\x85 \xce\xb8\xce\xb5\xce\xbb\xce\xb5\xcf\x84\xce\xb5 \xce\xbd\xce\xb1 \xce\xbf\xce\xbb\xce\xbf\xce\xba\xce\xbb\xce\xb7\xcf\x81\xcf\x89\xce\xbd\xce\xb5\xcf\x84\xce\xb1\xce\xb9 \xce\xb7 \xce\xbc\xce\xb5\xcf\x84\xcf\x81\xce\xb7\xcf\x83\xce\xb7 \\n '))\nN = int(raw_input('\xce\x94\xcf\x89\xcf\x83\xcf\x84\xce\xb5 \xcf\x84\xce\xbf\xce\xbd \xce\xb1\xcf\x81\xce\xb9\xce\xb8\xce\xbc\xce\xbf n \xcf\x80\xce\xbf\xcf\x85 \xce\xb8\xce\xb1 \xce\xb5\xce\xb9\xce\xbd\xce\xb1\xce\xb9 \xcf\x84\xce\xbf \xcf\x80\xce\xbb\xce\xb7\xce\xb8\xce\xbf\xcf\x82 \\n \xcf\x84\xcf\x89\xce\xbd \xcf\x84\xcf\x81\xce\xb1\xcf\x80\xce\xb5\xce\xb6\xce\xb9\xcf\x89\xce\xbd \xcf\x80\xce\xbf\xcf\x85 \xce\xb8\xce\xb1 \xcf\x87\xcf\x81\xce\xb7\xcf\x83\xce\xb9\xce\xbc\xce\xbf\xcf\x80\xce\xb9\xce\xbf\xcf\x85\xce\xbd\xcf\x84\xce\xb1\xce\xb9 \xcf\x83\xcf\x84\xce\xb7 \xcf\x80\xcf\x81\xce\xbf\xcf\x83\xcf\x83\xce\xb5\xce\xb3\xce\xb3\xce\xb9\xcf\x83\xce\xb7  \\n '))\nz = (x2-x1)/N\nx = x1\nwhile x < x2:\n    print (z*(f(x)+f(x+z))/2)\n    x += z\n
Run Code Online (Sandbox Code Playgroud)\n