Metoda siecznych, Metoda Newtona
Dodany: 24 stycznia, 2011 | Kategoria: InneOstatnio w ramach metod obliczeniowych robiłem pewne zadanko, które skojarzyło mi się z artykułem Platyny zamieszczonym na GMCLANie dotyczącym przeszukiwania binarnego i znajdywania pierwiastka danej liczby. W tym przypadku szukamy co prawda zupełnie innych pierwiastków, bo tych z równań, ale też zwiększamy dokładność wraz z każdym przejściem.
Samo zadanie:
Równanie x5 + 6x4 – 20x3 + 2x3 + 7x – 2 = 0 ma dwa pierwiastki bliskie 0.42. Wyznaczyć je Metodą Newtona oraz Metodą Siecznych.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <stdio.h> #include <math.h> // funkcja z A2 double f(double x) { return pow(x,5) + 6*pow(x,4) - 20*pow(x,3) + 2 * pow(x,2) + 7 * x - 2; } // metoda siecznych double Sieczne(double xn_1, double xn, double e, int m) { int n; double d; for (n = 1; n <= m; n++) { d = (xn - xn_1) / (f(xn) - f(xn_1)) * f(xn); if (fabs(d) < e) return xn; xn_1 = xn; xn = xn - d; } return xn; } // pochodna double p(double x) { return 5*pow(x,4)+24*pow(x,3)-60*pow(x,2)+4*x+7; } double Newton(double x, double e, double m) { double h; int n; for (n = 1; n<=m; n++) { h = - (f(x) / p(x)); if (fabs(h)<5E-11) { return x; } x = x + h; } return x; } int main(void) { /* 5E-11 to różnica poniżej której przestajemy szukać, w przeciwnym wypadku próbujemy max. 100 razy i ten wynik uznajemy za najdokładniejszy */ printf("%0.15f\n", Sieczne(0.30, 0.42, 5E-11, 100)); printf("%0.15f\n", Sieczne(0.42, 0.50, 5E-11, 100)); printf("%0.15f\n", Newton(0.30,5E-11,100)); printf("%0.15f\n", Newton(0.50,5E-11,100)); return 0; } |