Programmierung DiffGl.Sys < MathCad < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 18:07 Mo 24.05.2010 | Autor: | Hefepilz |
Hallo liebe Matheraum-Mitglieder,
schön, dass ich dieses Forum gefunden habe, für MathCAD ist das nicht so einfach.
Habe folgendes Problem, für das ich mir von hier Hilfe erhoffe. Vielleicht kann mir jemand weiterhelfen.
Und zwar habe ich ein Gleichungssystem mit zwei Differentialgleichungen mit rkfest gelöst. Das ist nicht weiter schwierig. Doch nun möchte ich es in einen Programmierteil einbinden, dort dann einen bestimmten Wert z.B. Z50 auswählen und mittels einer zweiten "normalen" Formel die Anfangswerte dieses Gleichungssystems neu berechnen. Und dies zyklisch z.B. 30x. Wenn ich das richtig verstehe, kann ich das mittels einer For-Schleife erreichen, doch wie setzte ich die Anfangswerte des Gleichungssystems immer wieder neu? Und wie lasse ich mir die Anfangswerte für jeden Zyklus in eine Tabelle ausgeben bzw. wie lasse ich mir die Anfangswerte in einem Diagramm in Abhängigkeit von der Zeit bzw. dem Zyklus darstellen (aus dem Programmierteil heraus)?
Besten Dank schon im Voraus für jegliche Hilfe.
mfg
Hefepilz
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:56 Di 25.05.2010 | Autor: | ullim |
Hi,
ich benutze Mathcad in der Version 14. Damit ist es möglich eine Differentialgleichung parametrisiert zu lösen. Dazu definierst Du die rechte Seite der DGL als Funktionen die von einem Parameter abhängen, z.B. den Anfangsbedingungen. Danach löst Du die DGL, z.B. durch Gdglösen und stellst die Lösung in der Form [mm] z(\theta) [/mm] dar.
Diese parametrisierte Form der Lösung der DGL kannst Du in einem For Loop aufrufen mit immer neuen Parametern und dann lösen, in Deinem Fall die Anfangsbedingungen.
Ein Problem was bei mir aufgetreten ist, ist eine ziemlich hohe CPU Last. Falls Du da was findest, was diese reduziert kannst Du mir das posten.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 13:50 Mi 26.05.2010 | Autor: | ullim |
Hi,
ich lege Dir mal mein geändertes Programm bei. [Dateianhang Nr. 1 (fehlt/gelöscht)]
Folgende Änderungen habe ich gemacht.
1. Der Parameter j in Deinem Programm hat keine Wirkung, da Du ja j als Laufvariable im For Loop benutzt. Dadurch wird j immer neu definiert und überschrieben. Somit kannst Du den Parameter auch weglassen. Das gleiche gilt für [mm] \gamma [/mm] und d.
2. Ich habe die Zwischenergebnisse von m und s für jeden Durchlauf in den Vektoren M und S abgespeichert und gebe den Vektor [mm] \vektor{M \\ S} [/mm] am Ende des Programms zurück. Auf die Ergebnisse kannst Du dann mit f zugreifen. M ist der 0'te Eintrag im Vektor f und S ist der 1'te Eintrag im Vektor f.
Willst Du die Ergebnisse auch noch in Abhängigkeit von [mm] \gamma [/mm] und d speichern, geht das genauso, allerdings must Du Dir überlegen, wie die Ergebnisse in den Vektoren M und S angeordnet sind. Die ersten Z Ergebnisse entsprechen [mm] \gamma=0.1 [/mm] d=1, die zweiten Z Ergebnisse [mm] \gamma=0.1 [/mm] und d=2 usw.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 13:56 Mi 26.05.2010 | Autor: | ullim |
Hi,
Hat mit dem hochladen nicht geklappt, deshalb nochmal.
ich lege Dir mal mein geändertes Programm bei Datei-Anhang. Folgende Änderungen habe ich gemacht.
1. Der Parameter j in Deinem Programm hat keine Wirkung, da Du ja j als Laufvariable im For Loop benutzt. Dadurch wird j immer neu definiert und überschrieben. Somit kannst Du den Parameter auch weglassen. Das gleiche gilt für [mm] \gamma [/mm] und d.
2. Ich habe die Zwischenergebnisse von m und s für jeden Durchlauf in den Vektoren M und S abgespeichert und gebe den Vektor [mm] \vektor{M \\ S} [/mm] am Ende des Programms zurück. Auf die Ergebnisse kannst Du dann mit f zugreifen. M ist der 0'te Eintrag im Vektor f und S ist der 1'te Eintrag im Vektor f.
Willst Du die Ergebnisse auch noch in Abhängigkeit von [mm] \gamma [/mm] und d speichern, geht das genauso, allerdings must Du Dir überlegen, wie die Ergebnisse in den Vektoren M und S angeordnet sind. Die ersten Z Ergebnisse entsprechen [mm] \gamma=0.1 [/mm] d=1, die zweiten Z Ergebnisse [mm] \gamma=0.1 [/mm] und d=2 usw.
Dateianhänge: Anhang Nr. 1 (Typ: rtf) [nicht öffentlich]
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 08:18 Mo 31.05.2010 | Autor: | Hefepilz |
Hallo Ullim,
vielen lieben Dank, Du hast mir super weitergeholfen. Auch das mit in Abhängigkeit von gamma und delta t hat mit mehreren verschachtelten Schleifen geklappt. Allerdings beansprucht die Berechnung wirklich sehr viel Rechenleistung und dauert seine Zeit, wenn viele Punkte berechnet werden sollen.
Mindestens eine Frage hätte ich aber noch. Und zwar, wie bekomme ich (bei ersterem Programm) f0 und f1 in ein Diagramm mit j auf der x-Achse? Hier meldet mir Mathcad, dass f0 kein Skalar sei und zeigt mir deshalb die Werte nicht im Diagramm an. Was müsste ich hier tun?
Meine weiteren Überlegungen führen dahin, dass abhängig von delta t und gamma bzw. s_ein mehr oder weniger Zyklen j benötigt werden, damit sich m und s der darauf folgenden Zyklen nicht mehr ändern. Aber wie bekomme ich hier einen verlässlichen Wert, ohne mehrmals ausprobieren und die MathCAD immer wieder neu rechnen lassen zu müssen (nimmt zu viel Zeit in Anspruch).
Ich dachte hier an eine while-Schleife mit Toleranz. Aber ich kann für die Abweichung keinen festen Wert annehmen, sondern muss die Differenz vom (j-1)ten Zyklus minus dem Wert des j-ten Zyklus verwenden. Aber wie mache ich das MathCAD begreiflich?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:37 Di 01.06.2010 | Autor: | ullim |
Hi,
> Hallo Ullim,
>
> vielen lieben Dank, Du hast mir super weitergeholfen. Auch
> das mit in Abhängigkeit von gamma und delta t hat mit
> mehreren verschachtelten Schleifen geklappt. Allerdings
> beansprucht die Berechnung wirklich sehr viel
> Rechenleistung und dauert seine Zeit, wenn viele Punkte
> berechnet werden sollen.
>
Bei dem Beispiel das ich gerechnet habe, habe ich ca. 18 [s] Rechenzeit gebraucht. Stimmt das etwa mit Deiner überein? Ich nutze einen X9000 Extrem Dual Core Prozessor. Die Zeit habe ich mit time() bei Start der Berechnung und time () Ende Berechnung und Differenzbildung ermittelt, s. Anhang.
> Mindestens eine Frage hätte ich aber noch. Und zwar, wie
> bekomme ich (bei ersterem Programm) f0 und f1 in ein
> Diagramm mit j auf der x-Achse? Hier meldet mir Mathcad,
> dass f0 kein Skalar sei und zeigt mir deshalb die Werte
> nicht im Diagramm an. Was müsste ich hier tun?
>
Du kannst einfach per Array Index auf die Daten zugreifen wie Du aus meinem Beispiel siehst. Ich habe in meinem Code eine Grafik anzeigen lassen und die Werte der Grafik über diesen Mechanismus dargestellt. Ich habe Dein zweites Beispiel genommen und die Werte für m und s in den Arrays M und S abgespeichert. Immer die ersten Z Werte und dann die nächsten Z Werte direkt dahinter.
Frage: Gibt es bei Mathcad 2000 den Befehl spur oder trace, er ist mir sehr hilfreich gewesen.
> Meine weiteren Überlegungen führen dahin, dass abhängig
> von delta t und gamma bzw. s_ein mehr oder weniger Zyklen j
> benötigt werden, damit sich m und s der darauf folgenden
> Zyklen nicht mehr ändern. Aber wie bekomme ich hier einen
> verlässlichen Wert, ohne mehrmals ausprobieren und die
> MathCAD immer wieder neu rechnen lassen zu müssen (nimmt
> zu viel Zeit in Anspruch).
> Ich dachte hier an eine while-Schleife mit Toleranz. Aber
> ich kann für die Abweichung keinen festen Wert annehmen,
> sondern muss die Differenz vom (j-1)ten Zyklus minus dem
> Wert des j-ten Zyklus verwenden. Aber wie mache ich das
> MathCAD begreiflich?
>
Hier habe ich eine prinzipielle Frage. In dem Beispiel das Du gepostet hast war gamma ein Array Index. Das geht glaube ich nicht. Indizes sind immer Integer. Deshalb habe ich mein Beispiel entsprechend abgeändert.
Willst Du auch wirklich die Variable d so nutzen wie beschrieben? Also als nächsten Startwert den d'ten Wert der Lösung nehmen.
rkfest-02
Dateianhänge: Anhang Nr. 1 (Typ: rtf) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:28 Mi 02.06.2010 | Autor: | Hefepilz |
naja, mit meinem Laptop und den 2,1GHz ist nicht viel möglich, da ich im Moment zu Hause an dem Projekt arbeite. Bei wenigen berechneten Punkten ist die Rechenzeit akzeptabel, aber wenn ich mir 10.000 Ergebnisse ausgeben lassen möchte, dann dauert das schon eine Weile.
Du hast also praktisch den Umweg über die Zeit gewählt, um die Ergebnisse grafisch darzustellen.
Gehe ich also richtig der Annahme, dass eine direkte Darstellung der Ergebnisse mit "j" auf der X-Achse und die Endergebnisse von "m" und "s" bzw. von f0 und f1 auf der y-Achse nicht möglich ist? Bei deinem Beispiel steht ja jetzt unten auf x-Achse i mit 1x10hoch 3 usw.
> Hier habe ich eine prinzipielle Frage. In dem Beispiel das
> Du gepostet hast war gamma ein Array Index. Das geht glaube
> ich nicht. Indizes sind immer Integer. Deshalb habe ich
> mein Beispiel entsprechend abgeändert.
Ja, das stimmt, MathCAD hat schon gemeckert. Der Wert für Gamma soll zwar nur von 0 bis 1 gehen, hab mir deshalb damit abgeholfen, dass ich jetzt ganzahlige gamma verwende, diese aber in der Formel im Programm wieder teile.
> Willst Du auch wirklich die Variable d so nutzen wie
> beschrieben? Also als nächsten Startwert den d'ten Wert
> der Lösung nehmen.
Ja, das ist Sinn und Zweck der Übung. Brauche die Ergebnisse des Gleichungssystems um diese dann mit der Formel umzurechnen, um dann das Formelergebnis als Startwert für die neue Schleife zu verwenden.
> Frage: Gibt es bei Mathcad 2000 den Befehl spur oder trace, er ist mir sehr hilfreich gewesen.
Das Probiere ich gleich mal aus.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:26 Mi 02.06.2010 | Autor: | ullim |
Hi,
man kann das abspeichern der Werte auch so organisieren sieh mal hier.
Damit hast Du den Zugriff auf die Werte von mund s pro Schleife über j. Hilft das weiter?
Dateianhänge: Anhang Nr. 1 (Typ: rtf) [nicht öffentlich]
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:43 Do 03.06.2010 | Autor: | ullim |
Hi,
hier nochmal eine Variante mit "while". Schau mal hier
Dateianhänge: Anhang Nr. 1 (Typ: rtf) [nicht öffentlich]
|
|
|
|