2014-12-06 1 views
2

내 프로그램은 두 개의 숫자 (x1, x2) 사이의 주어진 함수의 적분을 n 개의 사다리꼴을 사용하여 정의하는 것을 목표로합니다. 내 부서의 자동 평가 프로그램은 mine.Problem의 난, 반올림 문제에사다리꼴 규칙 (초보자)을 사용하여 적분을 정의하는 방법

def funct(x): 
    val= -(1./6)*(x-1)*(x-2)*(x+2)*(x-4) 
    return val 


x1,x2,n=input() 
Dx=float(x2-x1)/n 
Sum=0 
i=x1+Dx 
while i<x2: 
    val=funct(i) 
    Sum+=val 
    i+=Dx 
Sum=2*Sum 
val1=funct(x1) 
val2=funct(x2) 
S=(Dx/2)*(val1+val2+Sum) 
print "%.3f" %S 
+1

사용하는 x1 및 x2의 값은 무엇입니까? – ErikR

+0

x1과 x2는 x1 user4332869

+0

당신의 스타일이 바로크라고 말할 수 있습니까? 특히'Sum = Sum * 2' 문 ... 또 다른 언급 : 수학에서 처음으로 프로그래밍 된 버릇이 있기 때문에 하나의 문자는'i, j, k, m, n '변수로, 훨씬 적은 degree, l은 인덱스 또는 카운트로 사용되는 정수를 나타내는 데 사용됩니다. 예를 들어, 훨씬 더 관용적 인 사용법은'x_i = x1 + Dx' – gboffi

답변

1

, 당신의 while주기가 항상 x의 마지막 값을 포함 ... 내 코드에서 뭔가 잘못을 찾아 정확한 정수 연산을 사용하여 시도하지 못할 것입니다

x0, x1 = -88.787529, 83.494648 
n = 1942 

dx = (x1-x0)/n 
s = 0 
i = 1 
while i < n: 

    # if we allow i == n, in the following row we'll have 
    # x0 + n*dx = x0 + n * (x1-x0)/n = x0 + x1 - x0 = x1 
    # but we want to exclude the last term 

    s = s + funct(x0+i*dx) 
    i = i + 1 
result = (s + funct(x0)/2.0 + funct(x1)/2.0)*dx 
+0

덕분에 많이 발생했습니다. 언급 한 "반올림 문제"는 없습니다. – user4332869

+0

정수를 사용하거나 허용 오차 (예 :'while x_i <(x1-0.1 * dx)')를 사용하여 실제 변수를 반복하지 마십시오. 왜냐하면 반올림은 발행물. – gboffi

+0

오, 알았어, 나는 그 일에 대해 걱정했지만 그것이 실제로 문제가 될 수 있다는 것을 확신하지 못했다. 그 프로그래머는 실제로 지금까지도 훌륭하다. – user4332869

0

나는 이것을 안다. 아마도 일종의 숙제에 관한 질문 일지 모르지만 일반적으로 바퀴를 재발 명하지 마십시오 :

import numpy 

def funct(x): 
    return -(1./6)*(x-1)*(x-2)*(x+2)*(x-4) 

x1, x2 = -88.787529, 83.494648 
n = 1942 
# n "panels", n+1 points 
x = numpy.linspace(x1, x2, n+1) 
y = funct(x) 

result = numpy.trapz(y, x) 
+0

사실, 나는 전체적인 생각을 건너 뛸 수없는 멍청한 function.its를 알고있다. 프로 시저. 알 잖아. 프로그래밍을 위해서. 감사합니다. – user4332869