1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

VBA - Hilfe zu Aufgabenstellung

Discussion in 'Programmieren' started by Simone1987, Jun 23, 2012.

Thread Status:
Not open for further replies.
  1. Hallo,

    ich habe in der FH eine Aufgabenstellung bekommen, die ich gerade verzweifelt zu lösen versuche (habe normalerweise weder mit numerischer Mathematik noch mit Algorithmen viel zu tun und bin daher eher ahnungslos).

    Es geht um die Modifizierung des Newtonverfahrens in VBA. Das Verfahren selbst haben wir schon programmiert, jetzt sollen folgende Änderungen vorgenommen werden:


    1. die Eingabe von zwei Startnäherungen x-1=a und x0=b ermöglichen (wenn &#9474;f(x-1)&#9474; < &#9474;f(x0)&#9474; dann tauschen Sie x-1 und x0).

    2. die Ableitung durch den Differenzenquotienten f(xn)- f(xn-1)/ xn - xn-1 ersetzen (Regula falsi).
    Test am Bsp.: x7 – 4x3 + cos(x) + 2

    Dokumentieren Sie Ihre Modifikation durch ein Flussdiagramm und den VBA-Code.





    Hier unser VBA-Code zum Newtonverfahren:

    Sub newton()
    Dim x As Double
    Dim eps As Double
    Dim s As Double

    Dim n As Integer
    Dim i As Integer

    With Tabelle1
    x = .Cells(1, 1)
    eps = .Cells(1, 2)
    n = .Cells(1, 3)

    For i = 0 To n
    .Cells(3 + i, 1) = i
    .Cells(3 + i, 2) = x
    .Cells(3 + i, 3) = f(x)

    If Abs(f(x)) < eps Then
    MsgBox ("Nullstelle erreicht mit dem " & i & ".ten Iterationsschritt")
    Exit Sub
    End If

    If Abs(df(x)) < eps Then
    MsgBox ("Ableitung = 0 beim " & i & ".ten Iterationsschritt")
    Exit Sub
    End If

    s = f(x) / df(x)

    If Abs(s) < eps Then
    MsgBox ("Genauigkeit erreicht mit dem " & i & ".ten Iterationsschritt")
    .Cells(4 + i, 1) = i + 1
    .Cells(4 + i, 2) = x - s
    .Cells(4 + i, 3) = f(x - s)
    Exit Sub
    End If

    x = x - s

    Next

    .Cells(3 + n, 1) = n
    .Cells(3 + n, 2) = x
    .Cells(3 + n, 3) = f(x)

    End With
    End Sub

    Function f(x As Double) As Double
    f = x ^ 7 - 4 * x ^ 3 + Cos(x) + 2
    End Function

    Function df(x As Double) As Double
    df = 7 * x ^ 6 - 12 * x ^ 2 - Sin(x)
    End Function



    ------------------
    So. Mein Problem fängt schon bei den zwei Startnäherungen an, denn ich kann ja keine 2 Schleifen gleichzeitig laufen lassen, sondern nur hintereinander. Dass man ne neue Variable (zB xx) definiert und einlesen muss ist klar.
    Wie das mit dem Vertauschen geht weiß ich auch und ein Flussdiagramm bekomm ich notfalls auch noch hin.
    Aber: wie gebe ich den Differenzenquotienten ein? was muss ich dafür definieren?
    Und dann brauche ich die Funktion und den Diff.quot. ja jeweils einmal für x und einmal für xx, richtig?
    Und wie läuft das dann mit den Schleifen? Muss ich erst die eine Näherung laufen lassen und dann die andere, oder erste Schleife von Näherung 1, erste Schleife von Näherung 2, zweite Schleife von Näherung 1, etc (also immer hin und her)?

    wäre über jeden Tipp dankbar.
    LG

    :bahnhof:
     
  2. chipchap

    chipchap Ganzes Gigabyte

  3. X.MAN

    X.MAN Moderator

    @chipchap, erschrecke doch unseren neuen Forenteilnehmer nicht..;)

    @Simone1987, ein Thread reicht zu deinem Thema!

    Gruß
    X
     
  4. @x.man: sorry, wusste nicht wo es am besten hinpasst.

    @chipchap: für die schlechte qualität meiner ausbildung im bezug aufs programmieren kann ich nichts. und bücher zum thema habe ich, es hapert aber an der Umsetzung.
     
  5. X.MAN

    X.MAN Moderator

    Hinweis: Hausaufgaben werden hier von den Helfern zu 98% nicht übernommen...kann mich aber auch irren...
     
  6. Ich erwarte ja nicht, dass jemand mir die Aufgabe löst.
    Die Antwort auf eine meiner Fragen unten wäre u.U. schon hilfreich.
     
  7. P.A.C.O.

    P.A.C.O. Ex-Foren-Bulle

    Hab neulich von einer Kollegin gehört, dass es in der Klasse ihres (15 J.) Sohnes Usus ist, dass immer einer die Hausaufgaben macht und die dann abfotografiert per Samrtphone verschickt. Abwechselnd natürlich...


    So what :schlafen:
     
  8. chipchap

    chipchap Ganzes Gigabyte

    So ungefähr war mein Gedankengang ... ;)
     
  9. Eric March

    Eric March CD-R 80

    Newton… Regula falsi… Da hab ich plötzlich eine akute Form von Unlust ;)

    Quälen wir das Gehirn was damals im LK über mich hereinkam (auf Ethan-1-ol werde ich aber besser mal verzichten):

    Was sollen denn a, b, x, und x0 vorstellen? Und wieso speziell x-1?

    Weiterhin: die Tauschanweisung ist mir auch nicht schlüssig. wenn ich das einmal mit a durchlaufen lasse bekomme ich einige f(a). Mache ich das auch mit b kriege ich einen Schwung f(b). Und ich kann mir lebhaft vorstellen, dass mal der Betrag von a kleiner als der von b ist - und umgekehrt. Für welches a bzw. b ist denn die Bedingung zu erfüllen um als Schalter zu fungieren?

    Code:
    Sub newton()
    Rem Serie 1 (x-1) in Salten A,B,C; Serie 2 (x0) in E,F,G
    
    Dim x As Double
    Dim eps As Double
    Dim s As Double
    
    Dim n As Integer
    Dim i As Integer
    
    Dim ab As Byte
    
     ab = 0
     Do
    
      x = Cells(1, ab * 5 + 1)
      eps = Cells(1, ab * 5 + 2)
      n = Cells(1, ab * 5 + 3)
     
      For i = 0 To n
       Cells(3 + i, ab * 5 + 1) = i
       Cells(3 + i, ab * 5 + 2) = x
       Cells(3 + i, ab * 5 + 3) = f(x)
       
       If Abs(f(x)) < eps Then
        MsgBox ("Durchlauf " & ab + 1 & vbCr & vbCr & "Nullstelle erreicht mit dem " & i & ".ten Iterationsschritt")
        Exit For
       End If
       
       If Abs(df(x)) < eps Then
        MsgBox ("Durchlauf " & ab + 1 & vbCr & vbCr & "Ableitung = 0 beim " & i & ".ten Iterationsschritt")
        Exit For
       End If
       
       s = f(x) / df(x)
       
       If Abs(s) < eps Then
        MsgBox ("Durchlauf " & ab + 1 & vbCr & vbCr & "Genauigkeit erreicht mit dem " & i & ".ten Iterationsschritt")
        Cells(4 + i, ab * 5 + 1) = i + 1
        Cells(4 + i, ab * 5 + 2) = x - s
        Cells(4 + i, ab * 5 + 3) = f(x - s)
        Exit For
       End If
       
       x = x - s
      
      Next
      
      Cells(3 + n, ab * 5 + 1) = n
      Cells(3 + n, ab * 5 + 2) = x
      Cells(3 + n, ab * 5 + 3) = f(x)
      
      ab = ab + 1
     Loop Until ab = 2
    
    End Sub
    
    Function f(x As Double) As Double
     f = x ^ 7 - 4 * x ^ 3 + Cos(x) + 2
    End Function
    
    Function df(x As Double) As Double
     df = 7 * x ^ 6 - 12 * x ^ 2 - Sin(x)
    End Function
    Dies durchläuft den Code 2x und nutzt jeweils die Spalten A,B,C sowie D,E,F die mit den Vorgaben gefüttert werden müssen.
    Was fehlt wäre ein Umschalten, aber die Bedingungen sind für mich undurchsichtig.
    »Nebel, Nebel gehe weg - verzieh dich an ’nen andren Fleck!« (nach Hägar , dem Schrecklichen)

    Eric March
     
  10. Ohja, so gehts mir auch.
    x0 ist die Startnäherung aus dem Newtonverfahren. Über die Tangente am entsprechenden y-Wert wird ja dort ein neuer Näherungspunkt als Schnittpunkt Tangente/y-Achse generiert.
    Beim regula falsi approximiert man von zwei Seiten. Ich denke mit x-1 ist einfach gemeint, dass der Punkt weiter links liegen soll als x0.
    Der Tauschvorgang muss meiner Meinung nach deswegen direkt am Anfang erfolgen, vor den Schleifen.
    Ich hatte x-1 als Variable xx definiert und x0 als x.

    Code:
    If abs f(xx)<abs f(x) then				
    	p=x                        'p natürlich vorher als Tauschvariable definieren
    	x=xx
    	xx=p
    End if
    

    Das mit den Schleifen erscheint mir logisch, vielen Dank schonmal dafür!

    Bleibt immer noch die Frage was ich mit dem Differenzenquotienten anstelle.
    Dass ich ihn anstelle von df setze ist klar, aber wie wird der "formuliert" (kann ja nicht einfach f(xn) hinschreiben)
     
    Last edited: Jun 23, 2012
  11. Hascheff

    Hascheff Moderator

    :confused: Das verstehe ich nicht!
    Natürlich musst du dir 0 und -1 als Indizes vorstellen. Der Index -1 ist bei der Folgenbildung nicht üblich, er entsteht hier durch die Abwandlung der Aufgabenstellung. Es würde nur verwirren, wenn man das ursprüngliche x0 jetzt plötzlich x1 nennen würde. Im VBA-Code spielt das ja keine Rolle, dort heißen die Glieder der Folge einfach x (und xx in der abgewandeltenAufgabe).
    Damit erreicht man schneller das Ziel. Stell dir vor, die beiden zuletzt ermittelten Näherungswerte liegen rechts und links von der Nullstelle und die dazugehörigen Funktionswerte haben verschiedene Vorzeichen. (Im anderen Fall ist das folgende offensichtlich.)
    Die Nullstelle liegt dann meist näher am x mit dem kleineren Betrag des Funktionswertes, der nach der Regula falsi errechnete neue Näherungswert auch.
    Nein, das muss in jeder Schleife am Anfang geprüft werden.
    Du musst wissen, dass es df, den Differentialquotienten erst seit Leibniz und Newton gibt. Vorher gab es nur den Differenzenquotienten.
    In diesem Term steht / für einen Bruchstrich. Dieser trennt Zähler und Nenner und macht damit auch Klammern überflüssig.
    Du musst im Algorithmus natürlich Klammern setzen: (f(x)- f(xx))/ (x - xx)
     
  12. Mit df war in unserem Beispiel delta f, die erste Ableitung, gemeint.


    OK, das hilft mir weiter. Also immer erst prüfen, dann die Schleife für die erste Näherung, Schleife für die zweite Näherung und dann wieder prüfen vor der nächsten Bedingung, richtig?

    Danke für deine Hilfe. Ich werds die Tage nochmal versuchen (erstmal noch 2 Klausuren hinter mich bringen) und dann vom Ergebnis berichten.
    :danke:
     
  13. Hascheff

    Hascheff Moderator

    Also musst du nicht wissen, was df oder delta f bedeuten. Wir haben früher den Differe3nzenquotienten mit delta f/delta x bezeichnet.

    Wichtig für dich ist nur, dass eure erste Aufgabenstellung sozusagen ein modernes Verfahren darstellt und die Modifikation das altertümliche Verfahren. Es handelt sich also nicht um eine sinnlose, schikanöse Erfindung eures Lehrers.
     
  14. Ist mir bewusst. Mir ist allerdings nicht bewusst, was ich als Bekleidungstechniker mit dem Wissen darüber anfangen soll. Ich arbeite schon fast 2 Jahre nebenbei in der Industrie und brauche Excel höchstens mal für Tabellen. Summen zu bilden ist da das höchste der Gefühle. :grübel:
     
  15. Hascheff

    Hascheff Moderator

    Du musst vor allem lernen, wie man einem Programmierer einen klar formulierten Auftrag erteilt.
     
  16. Ok, der erneute Versuch, ein Mathestudent hat mir geholfen. Allerdings ist er in VBA weniger fit als in Mathe.

    Code:
    Option Explicit
    Sub newton()
    
    'Variablen
    Dim x As Double             'erste Startnäherung
    Dim xx As Double            'zweite Startnäherung
    Dim g As Double             'Tauschvariable
    Dim eps As Double
    Dim s As Double
    
    Dim n As Integer
    Dim i As Integer
    
    'Tabelle einlesen
    With Tabelle1
        x = .Cells(1, 1)
        xx = .Cells(2, 1)
        eps = .Cells(1, 2)
        n = .Cells(1, 3)
    
    
    'Schleifen:
    
    'x und xx sortieren
    If Abs(f(x)) > Abs(f(xx)) Then
        g = x
        x = xx
        xx = g
    End If
    
    
    For i = 0 To n
       
    .Cells(4 + 2 * i, 1) = i            'Ausgaben
    .Cells(4 + 2 * i, 2) = x
    .Cells(4 + 2 * i, 3) = xx
    .Cells(4 + 2 * i + 1, 2) = f(x)
    .Cells(4 + 2 * i + 1, 3) = f(xx)
    
    
       If Abs(f(xx)) < eps Then
        MsgBox ("Nullstelle erreicht mit dem " & i & ".ten Iterationsschritt")
        Exit Sub
       End If
    
    
       If Abs(df(x, xx)) < eps Then
         MsgBox ("Ableitung = 0 beim " & i & ".ten Iterationsschritt")
         Exit Sub
       End If
       
    s = f(x) / df(x, xx)
    
       If Abs(s) < eps Then
        MsgBox ("Genauigkeit erreicht mit dem " & i & ".ten Iterationsschritt")
        .Cells(6 + 2 * i, 1) = i + 1
        .Cells(6 + 2 * i, 2) = xx - s
        .Cells(6 + 2 * i, 3) = f(xx - s)
        Exit Sub
       End If
    
    x = xx
    xx = xx - s
    
    Next
    
    .Cells(4 + 2 * n, 1) = n
    .Cells(4 + 2 * n, 2) = xx
    .Cells(4 + 2 * n + 1, 2) = f(xx)
    
    End With
    End Sub
    
    'Fkt definieren
    Function f(x As Double) As Double
        f = x ^ 7 - 4 * x ^ 3 + Cos(x) + 2
    End Function
    
    Function df(x As Double, xx As Double) As Double
        df = (f(xx) - f(x)) / (xx - x)
    End Function
    
    Könnte das stimmen?
     
  17. Hascheff

    Hascheff Moderator

    Das sieht gut aus.
     
Thread Status:
Not open for further replies.

Share This Page