Hallo Florian,
es ist nicht klar, ob du wirklich die Stammfunktion berechnen willst, oder nur eine nummerische Integration durchführen willst.
Die Bestimmung einer Stammfunktion ist sehr aufwändig. Für nicht zu komplizierte Funktionen habe ich das früher einmal in Fortran bewerkstelligt. Dieses Programm stelle ich aber nicht zur Verfügung.
Das Programmieren einer nummerischen Integration ist eigentlich einfach, weil es doch nur darum geht, das Intervall zwischen den Integrationsgrenzen in kleine Intervalle aufzuteilen, die Fläche, die die Funktion mit der x-Achse einschließt z.B. durch Näherung als Rechteck jeweils für jedes Teilintervall zu berechnen und alle Flächen zu addieren. Ich halte eine solche Aufgabe von Anfängern für lösbar!
Aus der Literatur sind dir wahrscheinlich verschiedene Näherungen bekannt. Ich habe mich für Simpson entschieden, weil erfahrungsgemäß so die Konvergenz leicht überprüft werden kann und so die besten Ergebnisse erzielt werden. Dabei wird die Anzahl der Teilintervalle automatisch so lange erhöht, bis der Quotient zweier aufeinander folgender Iterationen den Fehlerwert unterschreitet.
Das Makro ist für Excel vorgesehen.
Sub Integral_nach_Simpson()
'untere_Integrationsgrenze = A2
'obere_Integrationsgrenze = B2
'Funktion = C2
'relative Genauigkeit = D2, z.B. 0,0001
'Mit der Funktion müssen sowohl Excel als auch VBA etwas anfangen können:
'Die Integrationsvariable muss x heißen.
'z.B. x^3, sin(x)*ln(x) oder abs(ln(x))^log(x).
'Aber z.B. "Wurzel(x)" oder Sqr(x) gehen nicht, dafür z.B. "x^0.5".
'Fehler aus Polstellen oder Unstetigkeiten werden nicht unbedingt aufgefangen!
Cells(1, 1) = "untere Grenze"
Cells(1, 2) = "obere Grenze"
Cells(1, 3) = "Funktion(x)"
Cells(1, 4) = "Genauigkeit"
ActiveSheet.Range(Cells(1, 1), Cells(1, 4)).ColumnWidth = 15
ActiveSheet.Range(Cells(1, 3), Cells(1, 3)).ColumnWidth = 30
Application.Volatile
If Cells(2, 4) = 0 Or Cells(2, 4) = "" Then Cells(2, 4) = 0.001
f = Replace(Cells(2, 3), "e", "2,71828182845905")
d = Replace(f, "x", Cells(2, 1))
s = Evaluate(Replace(d, ",", "."))
d = Replace(f, "x", Cells(2, 2))
s = (s + Evaluate(Replace(d, ",", "."))) / 2
n = 2
Do
c = (Cells(2, 2) - Cells(2, 1)) / 2 / n
v = 0
a = Cells(2, 1)
For i = 1 To n - 1
a = a + c
d = Replace(f, "x", a)
v = v + 2 * Evaluate(Replace(d, ",", "."))
a = a + c
d = Replace(f, "x", a)
v = v + Evaluate(Replace(d, ",", "."))
Next i
a = Cells(2, 2) - c
d = Replace(f, "x", a)
v = v + 2 * Evaluate(Replace(d, ",", "."))
v = (Cells(2, 2) - Cells(2, 1)) * (s + v) / 3 / n
fehler = Abs(w - v)
If n = 2 Then fehler = 10000
w = v
z = w * CDbl(Cells(2, 4)): If w kleiner 1 Then z = 1'Kleiner-Zeichen verwenden!"
n = n + 1
Loop Until fehler kleiner= z 'Kleiner-Zeichen verwenden!"
MsgBox v
End Sub
Ich würde das Makro in eine passende UserForm einbetten.
Ich bitte um Rückmeldung!
Gruß
Holger
Florian Krüger schrieb am 09.12.2010 19:44:21:
Hallo zusammen,
ich bin absoluter Neuling auf dem Gebiet der Programmierung und habe von unserm Dozenten ein Studienprojekt zur nummerischen Integration zugeteilt bekommen. Bisher bin ich schon ganz gut voran gekommen (Funktion einlesen, mittelwerte u.s.w.), nur an der Stammfunktion hapert es. Denn diese muss für jede mathematische Funktion gültig sein...Wie kann ich sowas in VBA programmieren??Vor allem wie definiere ich die Grenzen für eine beliebige Funktion????
danke im voraus |