Funkcja obliczająca pierwiastek z przybliżeniem korzystając z metody Newtona

0

Witam to mój pierwszy post. Zbliża się poprawka z programowania a ze względu na to że posiadam stary egzamin prosiłbym was o pomoc w zadaniu które wstawiam poniżej. Jak powinna wyglądać ta funkcja?

progr.jpg

1

Witaj.

Co napisałeś do tej pory i dlaczego uważasz, że ktoś odwali za ciebie całą robotę?

1

Jakbym dostał takie zadanie, to mógłbym nie pamiętać wzoru i to byłoby jedyną trudnością..
Ale Ty masz wszystko na tacy i nie potrafisz z tego skorzystać..
Nie dziwi mnie, że masz poprawkę i nie zdziwi mnie jak jej nie zaliczysz..
Strasznie nie lubię ludzi którzy idą po linii najmniejszego oporu.

0

def pierwiastek(p,x0):
    x1=0.5*(x0+(p/x0))
    if( ( x0 - x1 ) < 0.000001 ):
        return x1
    else : 
        return pierwiastek(p,x1)
0

dzięki poradziłem sobie.
zrobione na pętli do .. while..
do zamknięcia

0

Na pętli? Przecież tutaj ma być rekurencja ;o

0

@alzajac: to jest naprawdę proste zadanie. Ale zrobiłem je za Ciebie bo uczę sie Pythona i przyda mi się wprawka:

'''
TestNewton.py 
Created on 2011-09-07

@author: piotr
'''

def __nextNewton(x, yi):
    return 0.5 * (yi + x / yi)

def sqrtNewton(x, eps):
    yp = x / 2.0
    yn = __nextNewton(x, yp)

    while abs(yp - yn) > eps:
        yp = yn
        yn = __nextNewton(x, yp)

    return yn 

def runTest():
    x = 36.0
    eps = 1E-6
    y = sqrtNewton(x, eps)

    print "pierwiastek z ", x, " = ", y, " przy eps=", eps

if __name__ == "__main__":
    runTest()

Kilka uwag gdyby Cię pytali:

  • warunek "if" na końcu programu pozwala na używanie go zarówno jako programu jak i modułu (gdy będzie użyty jako moduł runTest() się nie uruchomi)
  • funkcja "__nextNewton" ma taką dziwną nazwę bo jest prywatna dla modułu (nie da się jej uruchomić z zewnątrz)

Zauważyłem teraz że jesteśmy w dziale C/C++.
Gdybyś jednak potrzebował wersji C/C++ to przerobienie tego nie powinno być problemem.

0

dziękuję wszystkim za odpowiedź i pomoc mimo mało ciepłego przyjęcia.. u mnie to wygląda teraz tak z tym że parametr x0 (u mnie "z") dałem na sztywno (liczyłem przykładowo na razie dla wartości x=2) bo właśnie nie ogarniam potrójnego znaku równości jeśli ktoś mógłby pomóc z tym jeszcze to byłbym wdzięczny... reszta działa:

double MYSQRT(double x)
{
    double y,z,temp;
    double e=0.000001;
    z=1.5;
        do{
        y=0.5*(z+(x/z));
        temp=z-y;
        z=y;
        }while(e<temp);
    return y;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0