Nummerische Integration -> Simpsonregel!

XamBonX

Commander
Registriert
Nov. 2002
Beiträge
2.838
hallo,

ich habe da ein kleineS Problem mit der Nummerische Integration. Entweder es liegt am Code, oder mein Mathematischer Ansatz ist falsch.

Problem ist, dass die Aussgabe der Summe für die Simpsonregel vollkommen falsch ist, während Trapez und Rechteckt richtig ausgegeben werden.

Weiterhin besteht meine Frage, wieso eine Zählvariable in meinem Fall i als Double dimensioniert werden kann, und nicht als Integer. Im Infounterricht, wird immer gesagt "Zählvariablen IMMER als Integer dimensionieren"

Dieses Programm ist auf die Sinunsfunktion ausgelegt! Es soll so bleiben!

Hier der Code:
Code:
Option Explicit

'Zählvariablen
Dim i As Double 'Zählvariable

'Funktionsvariablen
Dim fa As Double 'Funktion f von a -> f(a)
Dim fb As Double 'Funktion f von b -> f(b)

'Einzelne Funktionsvariablen
Dim a As Double 'Untere Grenze
Dim b As Double 'Obere Grenze
Dim dx As Double ' Streifenbreite
Dim x As Double ' x = i * dx
Dim n As Double 'Anzahl der Streifen

'Summen
Dim SummeTrap As Double 'Summe der Trapezregel
Dim SummeReck As Double 'Summe der Rechteckregel
Dim SummeParab As Double 'Summe der Parabelregel

Private Sub cmdstart_Click()

  'Erklärung der Verwendeten Variablen !
  'x = i * dx
  'f(a) = f(a + (i + 1) * dx)
  'f(b) = f(a + x)
 
  SummeReck = 0
  SummeTrap = 0
  SummeParab = 0
  a = Val(txta)
  b = Val(txtb)
  n = Val(txtn)
  dx = (b - a) / n
     
  'Rechteck
  For i = 0 To n - 1
    x = i * dx
    SummeReck = SummeReck + (dx * Sin(x))
  Next i
 
  'Trapez
  For i = 0 To n - 1
    fa = Sin(a + (i + 1) * dx)
    fb = Sin(a + i * dx)
    SummeTrap = SummeTrap + ((fa + fb) / 2) * dx
  Next i
   
  'Parabelregel
  'I f(x)dx = 1/6*(f(a)+4*f(a+b/2)+f(b))
   For i = 0 To n - 1
   fa = Sin(a + (i + 1) * dx)
   fb = Sin(a + i * dx)
    SummeParab = SummeParab + (fa + (4 * ((fa + fb) / 2)) + fb) / 6
   Next i
 
lblsummreck.Caption = Str(SummeReck)
lblsummtrap.Caption = Str(SummeTrap)
lblsummparab.Caption = Str(SummeParab)
End Sub

Private Sub cmdend_Click()
Unload Me
End Sub

Private Sub txta_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub

Private Sub txtb_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub

Private Sub txtn_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub

Die Simpsonregel steht hier:
http://www.dom-gymnasium.de/mathpage/themen/numintegr/

ich weiß nicht, isses der mathm. Ansatzt, oder isses der code...

Danke im Vorraus,
Xam
 
Ne, das hilf mir auch nicht weiter!
Mein Code sieht z.Z. so aus
Code:
Option Explicit

'Zählvariablen
Dim i As Double 'Zählvariable

'Funktionsvariablen
Dim fa As Double 'Funktion f von a -> f(a)
Dim fb As Double 'Funktion f von b -> f(b)

'Einzelne Funktionsvariablen
Dim a As Double 'Untere Grenze
Dim b As Double 'Obere Grenze
Dim dx As Double ' Streifenbreite
Dim x As Double ' x = i * dx -> I-ter Streifen
Dim n As Double 'Anzahl der Streifen

'Summen
Dim SummeTrap As Double 'Summe der Trapezregel
Dim SummeReck As Double 'Summe der Rechteckregel
Dim SummeParab As Double 'Summe der Parabelregel
Private Sub cmdstart_Click()

  'Erklärung der Verwendeten Variablen !
  'x = i * dx
  'f(a) = f(a + (i + 1) * dx)
  'f(b) = f(a + x)
  
  SummeReck = 0
  SummeTrap = 0
  SummeParab = 0
  a = Val(txta)
  b = Val(txtb)
  n = Val(txtn)
  dx = (b - a) / n
     
  'Rechteck
  For i = 0 To n - 1
    x = i * dx 'I-ter Streifen
    SummeReck = SummeReck + (dx * Sin(x))
  Next i
  
  'Trapez
  For i = 0 To n - 1
    fa = Sin(a + (i + 1) * dx) 'Funktion f von a -> f(a)
    fb = Sin(a + i * dx) 'Funktion f von b -> f(b)
    SummeTrap = SummeTrap + ((fa + fb) / 2) * dx
  Next i
    
  'Parabelregel
  'I f(x)dx = 1/6*(f(a)+4*f(a+b/2)+f(b))
  '(h/3)*(Summe0+4*Summe1+2*Summe2)
   For i = 0 To n - 1
   fa = Sin(a + (i + 1) * dx) 'Funktion f von a -> f(a)
   fb = Sin(a + i * dx) 'Funktion f von b -> f(b)
    SummeParab = SummeParab + dx / 6 * (fa + (4 * ((fa + fb) / 2)) + fb)
   Next i
  
lblsummreck.Caption = Str(SummeReck)
lblsummtrap.Caption = Str(SummeTrap)
lblsummparab.Caption = Str(SummeParab)
End Sub
Private Sub cmdend_Click()
Unload Me
End Sub


Private Sub txta_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub
Private Sub txtb_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub
Private Sub txtn_KeyPress(KeyAscii As Integer)
    If KeyAscii = 44 Then KeyAscii = 46
End Sub

Aber die Summer der Trapez und Parabel (Simpson)-Regel ist identisch.

Irgendwas läuft da falsch....
 
Zurück
Oben