Trapezregel

WIstud2015

Mitglied
Hallo zusammen,

ich bin neu hier im Forum und studiere derzeit WI im 1. Semester.

Leider komme ich bei einer Aufgabe einfach nicht weiter.
Es geht um die Berechnung des Flächeninhalts mit Hilfe der Trapezregel.
(Die genaue Aufgabenbeschreibung ist angehängt.)
Aufgabe Trapezregel.PNG


Ich habe bereits verschiedene Varianten ausprobiert, komme aber einfach nicht auf das geforderte Ergebnis. Ich denke ein Problem ist die Umsetzung des Summenzeichens.
Normalerweise, wird dies ja mit einer for-Schleife gelöst (?), ich bin mir aber nicht sicher, ob das hier richtig ist.

Wenn jemand eine Idee hat und mir einen Tipp geben könnte wäre ich sehr dankbar :)


Hier mein Code:
Nur die Methode "integrate" soll verändert werden!
Java:
public class Functionality {
   
    public static final double EPSILON = 1E-10;
   
    public static void main(String[] args) {
       
        System.out.println("Integral von 0.1 bis 0.2 = " +
                 integrate(0.1,0.2) + " // sollte etwa 0.0394319 ergeben.");
        System.out.println("Integral von 0.5 bis 1 = " +
                 integrate(0.5,1) + " // sollte etwa 0.149882 ergeben.");
        System.out.println("Integral von 0 bis 1 = " +
                 integrate(0,1) + " // sollte etwa 0.341345 ergeben.");
        System.out.println("Integral von 100 bis 200 = " +
                 integrate(100,200) + " // sollte etwa 0 ergeben.");
        System.out.println("Integral von 0.9 bis 1.337 = " +
                 integrate(0.9,1.337) + " // sollte etwa 0.0934488 ergeben.");
               
       
    }
    /**
     * Die integrate(double a, double b) Methode berechnet eine Annäherung für
     * das Integral von a bis b über der Funktion f.
     *
     * @param a - Untere Grenze des Intervalls
     * @param b - Obere Grenze des Intervalls
     * @return eine Annäherung des Integrals von a bis b über der Funktion f
     * @return Double.NaN falls a==Double.NaN oder b==Double.NaN
     */
    public static double integrate(double a, double b) {
        double Flaecheninhalt=0;
        double h;
        double Preresult=-1;
        double summe = 0;
        double temp=0;
   
   
        if (a==Double.NaN || b==Double.NaN)
        {return Double.NaN;}

        else{       
       
        for (int n = 1;Flaecheninhalt-Preresult>=EPSILON; n++) {
       
            h=(b-a)/n;
           
            for (int k=1;k<=(n-1);k++){
                summe = f(a+k*h);
                temp= summe;
                summe= summe+temp;
           
            }
       
            Preresult=Flaecheninhalt;
            Flaecheninhalt=h*((f(a)/2) + (f(b)/2) ) ;
            Flaecheninhalt=(Flaecheninhalt+summe) ;
   
            }

            return Flaecheninhalt;
           
        }
    }
   
   
    public static double f(double x) {
        /*
         * Don't change anything here!
         */
       
        // Standardized normal distribution
        return 1.0 / Math.sqrt(2.0 * Math.PI) * Math.exp(- x*x / 2.0);
    }

}
 

bene2808

Aktives Mitglied
Summe nach jedem Durchlauf der äußeren Schleife auf 0 zurücksetzen?o_O Also eher so:

Java:
summe = 0;
for (int k = 1; k <= (n - 1); k++) {
   summe += f(a + k * h);
}

Beim Testen rechnet aber zumindest mein Computer ewig und die Differenz zum letzten Ergebnis erreicht nicht annähernd den gewünschten Betrag:confused:

Performanter wäre es auf jeden Fall, nicht jedes Mal aufs Neue die Summe komplett zu berechnen, sondern immer bloß mit der neuen Obergrenze, also n - 1, den Funktionswert hinzuzuaddieren.
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben