Nadesłany przez Tomasz Lubiński, 08 sierpnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Falsi.java:
/**
* Metoda Regula Falsi
* www.algorytm.org
* Tomasz Lubinski (c)2005
*/
public class Falsi {
private static int n,p,q;
private static double a[];
// algorytm Hornera - obliczanie wartosci wielomianu
private static double w(int k, double x){
if (k==n)
return a[n];
else
return w(k+1,x)*x+a[k];
}
// Algorytm Show-Trauba funkcja pomocnicza s(j)
private static double s(int j) {
return (n-j)%q;
}
// Algorytm Show-Trauba funkcja pomocnicza r(j)
private static double r(int j) {
if (j%q==0)
return q;
else
return 0;
}
// Algorytm Show-Trauba - glowna funkcja
private static double T(int i, int j, double x) {
if (x==0) //by mozna bylo obliczyc pochodna w punkcie x=0
return a[j];
else
if (j==-1)
return a[n-i-1]*Math.pow(x,s(i+1));
else
if (i==j)
return a[n]*Math.pow(x,s(0));
else
return T(i-1, j-1, x)+T(i-1, j, x)*Math.pow(x,r(i-j));
}
private static double pochodna(int stopien, double punkt) {
if (punkt==0)
return T(n,stopien,punkt);
else
return T(n,stopien,punkt)/Math.pow(punkt,stopien%q);
}
public static void main(String[] args) {
int l;
double y,z,c;
System.out.println("Metoda Ragula Falsi - obliczanie zer funkcji nie liniowych\nna przykladzie wielomianow\nPodaj stopien wielomianu\n");
n = Console.readInt("?");
a = new double[n+1];
if (n<2) {
System.out.println("Za maly stopien wielomianu");
return;
}
System.out.println("Podaj teraz kolejne wspolczynniki wielomianu.\nZaczynij od tego z najwieksza potega.");
for(int k=n; k>=0; k--) {
a[k] = Console.readDouble("a"+k);
}
System.out.println("Podaj poczatek przedzialu");
y = Console.readInt("?");
System.out.println("Podaj koniec przedzialu");
z = Console.readInt("?");
if (z<y) {
System.out.println("Koniec przedzialu jest mniejszy od poczatku");
return;
}
System.out.println("Podaj liczbe iteracji");
l = Console.readInt("?");
p=1; q=n+1;
if ((pochodna(1,y)*pochodna(2,y))<0) {
c=z;
for (int k=1; k<=l; k++) {
c=c-(w(0,c)/(w(0,y)-w(0,c)))*(y-c);
if (w(0,c)==0) {
break;
}
}
}
else {
c=y;
for (int k=1; k<=l; k++) {
c=c-(w(0,c)/(w(0,z)-w(0,c)))*(z-c);
if (w(0,c)==0) {
break;
}
}
}
if (w(0,c)==0) {
System.out.println("Dokladny pierwiastek wynosi "+c);
}
else {
System.out.println("Przyblizony pierwiastek wynosi "+c);
}
return;
}
}

