2012-11-20 2 views
2

파이썬에서 내장 함수가 아닌 보간법을 사용하여 주어진 시간 간격으로 함수의 루트를 얻으려고합니다.파이썬 보간 오류

나는 다음을 수행했는데 내가 어디로 잘못 가고 있는지 알지 못한다. 나는 이등분으로 끝냈다. 유일한 차이점은 테스트 포인트 일 것이다.

X1 및 X2는 간격의 양단이며, f는 함수이고, ε는 F = 죄 (X^2)는 단순히 다음과 같이 진동 (100)의 반복을 반환하여이 실행 허용

def interpolation (x1,x2,f,epsilon): 
i = 1 
n = 100 
while i<n: 
    m = (f(x2)- f(x1))/(x2-x1) 
    b = f(x2) - m*(x2) 
    p = b 
    print (i,p,f(p)) 
    if f(p) == 0 or b< epsilon: 
     print ('The root is at ',p,'after',i,'iterations') 
     break 
    i+= 1 
    if f(x1)*f(p) > 0:   #Equal signs 
     x1 = p 
    else: 
     x2 = p 

이다 :

코드는 경우

(80, 1.3266674970489443, 0.98214554271216425) 
    (81, 1.4900968376899661, 0.79633049173817871) 
    (82, 1.3266674970489443, 0.98214554271216425) 
    (83, 1.4900968376899661, 0.79633049173817871) 
+1

관련 없음 : 'i phihag

+0

"나는 다음과 같은 일을했으며 어디에서 잘못 될지 모릅니다." 적어도 코드의 동작에 어떤 문제가 있다고 말할 수 있습니까? – Marcin

+0

감사합니다. – user1778543

답변

2

. 보간 방법에는 3 개의 초기 값이 필요합니다.

I 나는 확실히 방향이 당신이 당신의 코드로 가고 있었다 모르겠지만, 나는 다음과 같이 조금을 조정 할 수 있었다 :

그것은 하나의 내 시작 위치에 따라 4 반복에 그것을 해결
i = 1 
n = 100 
while i<n: 
    print x1, x2 
    m = (f(x2)- f(x1))/(x2-x1) 
    b = f(x2) - m*(x2) 
    p = -b/m #root for this line 

    # are we close enough? 
    if abs(f(p)) < epsilon: 
     print ('The root is at ',p,'after',i,'iterations') 
     break 
    i+= 1 

    x1 = x2 
    x2 = p 

, 2 :

1 2 
2 1.52648748495 
1.52648748495 1.75820676726 
1.75820676726 1.7754676477 
('The root is at ', 1.7724406948343991, 'after', 4, 'iterations') 
+0

고맙다. 나는 그것이 내가 잘못한 곳을 본다. 실수로 대답하지 말고 대답하기 – user1778543

0

당신이 실제로 원하는 것은, 당신은 준비가 만든 MODUL를 사용하는 것이 좋습니다을 (대신 운동을위한 솔루션을 개발) 문제를 해결하는 것입니다 이자형.

내 첫 번째 선택이 모듈은 뉴턴 - 랩슨 같은 너무 다른 방법을 가지고 scipy.optimize.bisect() (docs)

, 것 등

당신이 시컨트 방법을 사용하여이 문제를 해결하려고하는 것 같습니다
+0

나는 운동을 위해 그것을하려고 노력하고있다.) – user1778543