[C#] Nummerische Integration

l00m

Newbie
Registriert
Nov. 2006
Beiträge
7
Tach,

ich bin gerade an einem integral berechnen mit hilfe von visual c#. nun mein code hat noch iergend eine make, jedenfalls berechnet es nicht korrekte werte. kann mir wer helfen?

hier mein code:

private double a = 0, b = 0, A = 0, n = 0, h = 0, Teilf = 0, xi=0;
private int i;


static void Main()
{
Application.Run(new Form1());
}

//const double eps = 1e-05;

private void button1_Click(object sender, System.EventArgs e)
{
a = Convert.ToDouble(textBox1.Text);
b = Convert.ToDouble(textBox2.Text);
n = Convert.ToDouble(textBox3.Text);
xi = (b - a) / n;


for (i = 0; i <= n - 1; i++)
{

h = Math.Sin(xi);
Teilf = h*xi;
A += Teilf; //A = A + Teilf;


}
textBox4.Text = A.ToString();
}
}
}

xi habe ich soweit richtig, aber h stimmt nicht.

legende:

a linke schranke
b rechte schranke
n teile - wieviele teile er die fläche unter dem integral teilen soll (je mehr, desto genauer)
xi beliebiges x auf der x achse

die idee ist halt wie bei der normalen integration. man teilt eine fläche unter einer funktion in unendliche viele rechtecke und summiert die teile dann.

danke für die hilfe
 
AW: [C#] Nummerische Integration (Help)

Willkommen bei CB!

Mit was hast du das nachgerechnet? Normalerweise müssten trigonometrische Funktionen mit dem Bogenmaß definiert sein. Da musst du aufpassen. Wenn du dir nicht sicher bist, dann fang erstmal mit einer linearen Funktion an, anstatt eines Sinus.
Wenn es aber etwas genauer sein sollte, dann benutze das Simpson-Verfahren oder ähnliches...

\edit: Dein Fehler scheint in der Berechnung von der Höhe h sein. Sin(xi) (xi ist ja nur die Breite des Intervalls) bringt ja immer das gleiche, was nicht dem Sinn der Integration entspricht. Als Stützpunkt ist der Mittelwert zwischen zwei äußeren Stützpunkten zu wählen
 
Zuletzt bearbeitet:
AW: [C#] Nummerische Integration (Help)

ah ok das mit dem bogenmass stimmt. ich versuch einmal mit einer anderen funktion. danke für den hinweis.

edit: ja klar da hast du recht! danke für den hinweis!!
 
Zuletzt bearbeitet:
AW: [C#] Nummerische Integration (Help)

dann liegt das problem bei xi oder nicht?

xi = (b - a) / n;

for (i = 0; i <= n - 1; i++)
{
h = Math.Sin(xi);
Teilf = h*xi;
A += Teilf; //A = A + Teilf;
.
.
.


xi ist ja bei mir konstant, sollte aber variieren
 
AW: [C#] Nummerische Integration (Help)

Hi, also was Götterwind sagte hätte ich jetzt auch gesagt :) (ehrlich)
nur mal so als kleinen Tipp, um die Schreibarbeit zu ersparen, statt
Code:
private double a = 0, b = 0, A = 0, n = 0, h = 0, Teilf = 0, xi=0;
kannst du einfach
Code:
private double a=b=A=n=h=Teilf=xi=0;
schreiben. ich bin mir nichtmal sicher ob du sie überhaupt initialisieren musst.

MfG
Psylo

edit: kannst du dein xi nicht auch nach jedem Schleifendurchgang erhöhen?
 
Zuletzt bearbeitet:
AW: [C#] Nummerische Integration (Help)

Du musst die Höhe mit dem aktuellen Schrittweit anpassen. xi bleibt konstant.

Der erste Wert liegt ja zwischen a und a+xi, für die zweite Höhe brauchst du ja dann den Funktionswert für den Wert zwischen a+xi und a+2*xi usw...

Also sowas wie:
Code:
 h=Math.Sin(a+i*xi+xi/2);

Du willst ja von a nach b und nicht von 0 bis n*xi.
 
Zuletzt bearbeitet:
AW: [C#] Nummerische Integration (Help)

ich glaub ich habs


h = (b - a) / n;


for (i = 0; i <= n - 1; i++)
{

xi = i * h + a;
Teilf = Math.Sin(xi)*h;
A += Teilf; //A = A + Teilf;

so sollts sein....
 
AW: [C#] Nummerische Integration (Help)

Du hast jetzt dummerweise xi und h umbenannt, was das für uns komplizierter macht. Egal wie du die Variablen nennst, du musst für die Bestimmung deines Intervalls in der Mitte zwischen zwei Schritten liegen, ansonst berechnest du ein Maximumsintervall.

Pass auch drauf auf, dass der Sinus durch die Abszisse schlägt, du also negative Flächen addierst. Nach einer Periode bist du nämlich wieder bei 0 als Fläche...
 
AW: [C#] Nummerische Integration (Help)

oh ja stimmt! ok ich muss das ändern.

danke für eure bemühungen. ich poste mein code gleich nochmal
 
AW: [C#] Nummerische Integration (Help)

ok hier nochmals mein code:

Code:
 private double a = 0, b = 0, A = 0, n = 0, h = 0, Teilf = 0, xi=0;
        private int i;

   
		static void Main() 
		{
			Application.Run(new Form1()); 
		} 

        //const double eps = 1e-05; 

        private void button1_Click(object sender, System.EventArgs e)
        {
            a = Convert.ToDouble(textBox1.Text);
            b = Convert.ToDouble(textBox2.Text);
            n = Convert.ToDouble(textBox3.Text);
            h = (b - a) / n;
                            
         
            for (i = 0; i <= n - 1; i++)
            {

                xi = i * h + a;
                Teilf = Math.Cos(xi)*h;
                A += Teilf;   //A =  A + Teilf;
                                
            }
            textBox4.Text = A.ToString();
        }
    }
}

wies aussieht geht es so. als funktion habe ich dieses mal den cosinus genommen. mit dem sinus gehts auch.

sieht so besser aus oder?

ps:

schön wäre noch wenn ich das jetzt als grafik in meinem programm ausgeben könnte! also die funktion aufgezeichnet... und wenn ich die funktion über ein feld eingeben könnte, und nicht jedes mal den code ändern muss. weiters wäre es gut wenn beim start nicht immer textfeld sowieso im textfeld steht.

meine oberfläche sieht bis jetzt so aus (siehe attachmend).

für zahlreiche tips zur oberflächendarstellung wäre ich sehr dankbar :)

gruss

martin aka l00m
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    10,1 KB · Aufrufe: 246
AW: [C#] Nummerische Integration (Help)

arbeitest du mit visual studio oder mit nem anderen editor. bei vs ist es bei mir so, dass wenn ich eine textbox mithilfe der vs toolbox hinzufüge, dass dann das Feld automatisch leer ist.
ansonsten weise der textbox doch ganz einfach einen leeren string zu, dann ist sie auch leer.
also z.B. einfach
Code:
textBox1.Text = "";
.
Wie du jetzt allerdings deine Funktion als Grafik darstellen kannst weiss ich nicht.
 
AW: [C#] Nummerische Integration (Help)

hi,

ich arbeite mit visual express 2005. den text in den boxen konnt ich jetzt wegmachen. ich hab das aber nicht über den code gemacht, sondern bei den properties (im formeneditor), den inhalt gelöscht.

zu diesem program habe ich noch eine frage:

beim visaul c# in der schule hatte ich beim formeneditor so eine leiste auf der linken seite (eben diese vs toolbox wie DaPsylo geschrieben hat). auf dieser leiste waren die ganzen elemente aufgelistet, welche man dann je nach wunsch auf die form ziehen konnte. bei meiner version, visual c# express, fehlt diese leiste jedoch... weiss jemand wo ich die anzeigen lassen kann?

vielen dank!
 
Zuletzt bearbeitet:
AW: [C#] Nummerische Integration (Help)

also ich habe auch die Express variante. bei mir war sie standard mäßig angezeigt. ansonsten einfach unter ansicht-> toolbox und dann isse da.

den text über die eigenschaften zu löschen ist natürlich der einfachste Weg, ich war erstaunt, was man alles einstellen kann bei so einem textfeld.

Zur der Sache um deine Funktion grafisch anzeigen zu lassen würde ich einfach mal unter http://www.mycsharp.de/wbb2/ schauen, die scheinen da sehr nett und hilfsbereit zu sein.

MfG
Psylo
 
Zurück
Oben