algorytm.org

Implementacja w Java

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Metoda regula falsi - Implementacja w Java
Ocena użytkownikóww: *****  / 3
SłabyŚwietny
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;
	}
}
Dodaj komentarz