Universität Hamburg - Fachbereiche - Fachbereich Mathematik

Java-Kurs (5)

Numerische Mathematik, WiSe 99/00 und SoSe 00, Bodo Werner

Zurück zum Inhaltsverzeichnis.

Numerische Integration

Die Klasse NumAnalysis

Statische Methoden, Überladen von Methoden
Ziel dieses Abschnitts ist es, eine Klasse namens NumAnalysis mit einigen Methoden der Interpolation (und später der numerischen Integration) zu bestücken, so dass die folgende Applikationsklasse lauffähig wird:
public class BspNumAn{
  static void main(String[] args){
    double[] x={0.1,0.2,0.3,0.4};
    double[] y={0.01,0.03,0.07,0.1};
    Funktion p1=NumAnalysis.PolynomInterpolation(x,y);
    Wurzel w =new Wurzel(0,1);
    Funktion p2= NumAnalysis.PolynomInterpolation(w,10);
    Funktion p3 =NumAnalysis.PolynomInterpolation(w,10,'t');
  }//Ende main()
}//Ende Applikationsklasse BspNumAn 
Dabei enthält die Klasse NumAnalysis drei verschiedene Methoden mit dem Namen PolynomInterpolation() und dem Rückgabewert Funktion, aber mit unterschiedlichen Parametern, man spricht von Überladen von Methoden. In allen drei Fällen wird die InterpolationsFunktion der Klasse Interpolation zurückgegeben, im ersten Fall werden Interpolationspunkte interpoliert, in den beiden anderen Fällen wird die Wurzelfunktion auf dem Intervall [0,1] an 11 Knoten interpoliert, zunächst an äquidistanten, dann an T-Knoten. Die Methoden werden so implementiert, dass die Interpolationen in dem Sinne der Projektaufgabe1 visualisiert werden.

Dass die Methode PolynomInterpolation() ohne Instanziierung eines Objekts der Klasse NumAnalysis nur durch Vorschalten des Namens dieser Klasse aufgerufen werden, liegt daran, dass diese Methoden den Zusatz static erhalten. Ihre Verwendung ist analog zu der der Methoden der Klasse Math.

public class NumAnalysis{
 
public static Funktion PolynomInterpolation(double[] x, double[] y){
   NewtonInterpolation NIP = new NewtonInterpolation(x,y);
   NIP.InterpolationsFunktion.setIntervall(x[0],x[x.length-1]); 
   //unterstellt, dass x[0]<x[1]<...<x[n]
   NIP.Zeichne();
   return NIP.InterpolationsFunktion;
 }//Ende PolynomInterpolation 1
 
public static Funktion PolynomInterpolation(Funktion f,int N){
   double[] x = new double[N+1];
   for (int i=0;i<=N;i++) x[i]=f.xMin+i*(f.xMax-f.xMin)/N;
   NewtonInterpolation NIP=new NewtonInterpolation(x,f);
   NIP.IP.setName("aequidistante Knoten");
   NIP.Zeichne();
   return NIP.InterpolationsFunktion;
  }//Ende PolynomInterpolation 2

  public static Funktion PolynomInterpolation(Funktion f,int N,char T){
   double[] x = new double[N+1];
   for (int i=0;i<=N;i++) 
     x[i]=0.5*(f.xMin+f.xMax+(f.xMax-f.xMin)*Math.cos((2.0*i+1)/(2.0*N+2)*Math.PI));
   NewtonInterpolation NIP=new NewtonInterpolation(x,f);
   NIP.IP.setName("T-Knoten");
   NIP.Zeichne();
   return NIP.InterpolationsFunktion;
  }//Ende PolynomInterpolation 3

}//Ende class NumAnalysis
Es wird vorausgesetzt, dass der Klasse Interpolation, wie in der Projektaufgabe gefordert, eine starke Methode Zeichne() zugefügt wurde.

Generell können auch Klassen, von denen Objekte instanziiert werden sollen, Methoden und Daten haben, die den Modifier static tragen. Solche Methoden heißen Klassenmethoden und solche Daten Klassenvariable. Sie sind unabhängig von den individuellen Objekten dieser Klasse. Wollen Sie ein Beispiel? Wir könnten der Klasse Funktion das Attribut public static String AutorIn="Jolanta" und die Methode

public static void getAutorin(){
System.out.println(AutorIn);
}
hinzufügen.

Die Klasse NumIntegration

Die folgende Klasse enthält auch nur statische Methoden, u.a. die rekursive Methode SimpsonAd, die ein adaptives Simpsonverfahren implementiert.
public class NumIntegration{
    public static double Simpson(Funktion f, double a, double b){
	double s=(b-a)/6*(f.getY(a)+4*f.getY((a+b)/2)+f.getY(b));
	return s;
    }//Ende Simpson()
    public static double SimpsonAd(Funktion f, double a, double b, double delta){
	double c=(a+b)/2;
	double h=b-a;
	double fa=f.getY(a); 
	double fc=f.getY(c);
	double fb=f.getY(b);
	double S_ab=(b-a)/6*(fa+4*fc+fb);
	double S_ac=(c-a)/6*(fa+4*f.getY((a+c)/2)+fc);
	double S_cb=(b-c)/6*(fc+4*f.getY((c+b)/2)+fb);
	double S=S_ac+S_cb; //Schaetzer
	double Q=S_ab; //Simpsons Quadraturformel
	
	if (Math.abs(Q-P)>h*delta) {
	    double Ad_ac=SimpsonAd(f,a,c,delta);
	    double Ad_cb=SimpsonAd(f,c,b,delta);
	    return Ad_ac+Ad_cb;
	}
	else{
	    return Q; //besser: Q+(Q-P)/15;
	}
    }//Ende SimpsonAd
}//Ende class NumIntegration

Weiter mit "Lineare Gleichungssysteme"