Zaimplementowałem w Javę metodę Newtona do rozwiązania równania nieliniowego
Natrafiłem na taką ciekawą rzecz, iż dla dla x0 będącego liczbą nieparzystą zawsze mam błąd względny = 0, natomiast dla x0 parzystego błąd jest > 0, ale taki sam dla wszystkich liczb parzystych oraz jest ta sama ilość obrotów pętli (przy tym samym epsilonie), co jest dla dziwne i nie wiem czy popełniłem błąd w programie, czy tak ma być
Oto kod:
package newton;
/**
* Netwon's method implementation
*/
public class Newton {
private static final double realRoot = 1.0;
public static double f(double x) {
return 2.0 + Math.cos((Math.PI / 2.0) * x) - 2.0 * x; // funkcja f
}
public static double fp(double x) {
return -1 / 2 * Math.PI * Math.sin((Math.PI * x) / 2) - 2; // pochodna f
}
public static double round(double value, int places) {
if (places < 0) {
throw new IllegalArgumentException();
}
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
public static double getRelativeError(double x) {
return Math.abs((x - realRoot) / realRoot);
}
public static void main(String[] args) {
double x0, epsilon, h;
epsilon = 0.001;
x0 = 1;
int n = 0;
do {
h = -(f(x0) / fp(x0));
x0 = x0 + h;
n++;
} while (Math.abs(h) > epsilon);
System.out.println("Newton");
System.out.println("x=" + x0);
System.out.println("n=" + n);
double relativeError = getRelativeError(x0);
System.out.println("Blad wzgledny: " + relativeError * 100 + "%");
}
}