2016-12-10 12 views
1

할당에 대해 범위를 a에서 b, [a,b] 사이의 범위로 찾으려고합니다.a에서 b 범위의 함수에서 찾을 수

미적분을 사용하면 이렇게 어렵지 않을 것입니다. 미적분의 정리에 근거하여 다음과 같이 코드의 특정 부분에 도달하기 위해 주위를 돌아 다녔습니다.

참고 : 테스트를 위해 f = x**2을 사용하고 있습니다.

문제가
def integrate(a,b,tolerance_level): 
    firsttrapezoid = simpleIntegrate(a,b) 
    secondtrapezoid = simpleIntegrate(a,b/2) + simpleIntegrate(b/2,b) 
    error_range = abs(firsttrapezoid - secondtrapezoid) 
    if error_range < tolerance_level: 
     return secondtrapezoid 
    else: 
     return integrate(a, b/2, tolerance_level/2) + integrate(b/2, b, tolerance_level/2) 

def simpleIntegrate(a,b): 
    return (b-a)*(f(a)+f(b))/2 

def f(x): 
    f = x**2 
    return f 

result = integrate(0,5,0.0001) 

print(result) 

는 I 41 주변 값을 얻을 수 있어야하지만 I 얻는 값은 44

+0

[a, b] 간격을 두 개의 작은 간격으로 나누는 방법을 확인하십시오. 특히 중점을 계산하는 방법을 확인하십시오. 방금보다 선명한보기를 원할 경우 : [0, 5]의 예제로 시작하지 마십시오. 예제 [1, 5]부터 시작하십시오. – joanolo

+0

@joanolo 내가 입력 한 예제 중 하나이기 때문에 나는 [0,5]를 사용하고 있었지만 시도해 보겠다. – tokyolerd

+2

=> 중점은 단지 5/2입니다. 그러나 [1, 5]로 작업한다면 ... 중간 점은 ... – joanolo

답변

1

주위 (a+b)/2

def integrate(a, b, tolerance_level): 
    firsttrapezoid = simpleIntegrate(a, b) 
    secondtrapezoid = simpleIntegrate(a, (a + b)/2) + simpleIntegrate((a + b)/2, b) 
    error_range = abs(firsttrapezoid - secondtrapezoid) 
    if error_range <= tolerance_level: 
     return secondtrapezoid 
    else: 
     return integrate(a, (a + b)/2, tolerance_level/2) + integrate((a + b)/2, b, tolerance_level/2) 


def simpleIntegrate(a, b): 
    return (b - a) * (f(a) + f(b))/2 


def f(x): 
    f = x ** 2 
    return f 


def intf(x): 
    int_f = (x ** 3)/3 
    return int_f 


a = 0 
b = 5 
tolerance = 0.0001 
result = integrate(a, b, tolerance) 
exactly = intf(b) - intf(a) 
error = abs(exactly-result) 
print("aprox: {approx} exactly: {exactly} error:{error} max error:{max_error}" 
     .format(approx=result, exactly=exactly, error=error, max_error=tolerance)) 
인 A와 B 사이의 중간에 변화 b/2

출력 :

aprox: 41.66668653488159 exactly: 41.666666666666664 error:1.9868214927498684e-05 max error:0.0001 
0

@eyllanesc (및 @joanolo)가 오류를 지적했습니다. 중간 점 계산에서.

다른 두 발언 :

1) 함수의 글로벌 이름으로 f에서 하드 배선이 좋지 디자인입니다. 한 사람이 둘 이상의 함수를 단일 계산의 일부로 통합하려는 경우 어떻게해야합니까? 귀하의 접근 방식은 그들이 반복적으로 f을 재정의하도록 강제 할 것이며, 이는 매우 불편할 것입니다. 대신에, 나는 simpleIntegrate 유사 변경 및 integrate 또는 simpleIntegrate 중 하나가 호출되는 라인을 만들어 적절한 조정과

def integrate(f, a, b, tolerance_level): 

def integrate(a, b, tolerance_level): 

을 변경하는 것이 좋습니다 것입니다. 결과 함수는 훨씬 더 유연 해집니다. 무엇보다도 함수를 통합하여 익명의 함수로 전달할 수 있습니다.

2) 구현중인 알고리즘은 대부분의 적분기에서 작동하지만 일부에서는 상당히 실패합니다. 조정을 한 후에 나는 위의

>>> def f(x): return 150*x*(1-x)*(x+1)**2 
>>> integrate(f,-1,1,0.001) 
0.0 

을 권장하지만 기능은 엔드 포인트에서와 중간 지점에서 동일한 값을 취한다해서 답이 약 40해야한다, 기능이 일정하다는 따르지 않는 , 그러나 실제로이 알고리즘은 그것이 있다고 가정합니다. 반면에, 알고리즘 은 대부분의 함수와 대부분의 간격에 대해에서 작동하므로, 그렇게 구현한다고 들었다면 너무 걱정하지 않아도됩니다.

+0

피드백을 주셔서 대단히 감사합니다. 내 함수 "integrate()"가 전체 크레딧을 받기 위해 반복적이라고 가정되었지만이 과제에 수학 모듈을 사용하지 않아도된다고 생각합니다. – tokyolerd

+0

방금 ​​내가 허용되지 않았 음을 확인했습니다. 수학을 가져 오십시오, 그래서 우리는 단순한 적분을 풀기 위해 노력하고 있다고 가정합니다. – tokyolerd

+0

수학의 가져 오기는 여기에 없습니다. 같은 방식으로 동작하는 다항식을 찾을 수있었습니다. 'integrate'는'(a, f (a))','(m, f (m))','(b, f (b))'점들이 언제나''simpleIntegrate''를 반환 할 속성을 가지고 있습니다. collinear (여기서'm = (a + b)/2'). 이러한 통합 기능에 대한 사용자의 접근 방식은 선형적인 것이라고 가정합니다. 반드시 그럴 필요는 없습니다. –