|
Schmankerl |

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.12.2012, 00:28
Titel: Lineare Gleichung lösen
|
 |
|
 |
|
Guten abend miteinander,
ich brüte gerade noch über meiner Hausarbeit und komme nicht wirklich weiter:
Problem:
Ich habe folgende Gleichung:
Dabei sind die Variablen Ers,m0,my,k,R,T0,p19... alle samt Vektoren und enthalten unterschiedliche Werte.
Alle Variablen sind bekannt bis auf p19. Nach dieser möchte ich für jede Gleichung auflösen.
Im Grunde habe ich ein lineares Gleichungssystem, bei der ich in jeder Zeile jeweils nach p19 löse und für jede Zeile dann ein entsprechend anderes p19 erhalte.
Die Frage ist, wie ich das nun lösen kann?
Habe es mit der "solve" Funktion versucht, das hat leider nicht funktioniert.
Hinweis: p19 existiert bereits, soll aber für eine bestimmte Bedingung (Ma19>1) jeweils in der entsprechenden Gleichung überschrieben werden indem nach dieser aufgelöst wird. Hoffe das ist verständlich?
Das kleine Programm habe ich mal angehängt...hat jemand einen Tipp?
Vielen Dank und ein schönes Vorweihnachtswochenende
Beschreibung: |
|
 Download |
Dateiname: |
Duese.m |
Dateigröße: |
2.24 KB |
Heruntergeladen: |
395 mal |
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 22.12.2012, 01:00
Titel:
|
 |
Hallo,
zunächst mal ist das System nicht in p19 linear.
Ich würde zunächst mal versuchen, das ganze für alle erste Komponenten zu lösen und das dann verallgemeinern. Mit fsolve hast du vielleicht mehr Glück als mit solve.
Was hat Ma19 mit p19 zu tun?
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.12.2012, 19:30
Titel:
|
 |
Zitat: |
das ganze für alle erste Komponenten zu lösen |
Meinst du quasi für alle ersten Komponenten der Vektoren?
Im Prinzip greife ich die doch so ab: Ers(1) bei einem reinen Vektor?
Zitat: |
Was hat Ma19 mit p19 zu tun? |
Angenommen es ist:
und dann soll die Rechnung nur ausgeführt werden, wenn
Ma19>1 ist, also für ZEILE 2 und 3
Für Zeile 2 und 3 soll der Wert von p19 neu berechnet werden, für Zeile 1 soll der Wert 0.5 beibehalten werden.
Hoffe jetzt ist es verständlicher?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 22.12.2012, 21:04
Titel:
|
 |
Hallo,
Zitat: |
Meinst du quasi für alle ersten Komponenten der Vektoren?
Im Prinzip greife ich die doch so ab: Ers(1) bei einem reinen Vektor? |
Genau.
Zitat: |
Hoffe jetzt ist es verständlicher? |
Ja. D.h. du kannst entweder per Schleife und Fallunterscheidung arbeiten oder mit logischer Indizierung.
Zuerst aber mal den skalaren Fall angehen.
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 23.12.2012, 18:55
Titel:
|
 |
|
 |
|
Danke Harald. Genau, den zweiten Teil mache ich mit den logischen Indizes.
Nur beim ersten Teil hapert es schon,es kommt die Fehlermeldung, dass eine explizite Lösung nicht gefunden werden konnte.
Gebe ich die Werte aber von Hand ein in die Formel und löse dann nach p19 auf, klappt es?
Habe in einem ersten Schritt einfach erstmal die Variable gelöscht und anschließend als symbolische Variable erstellt.
Woran hapert es? Bis auf "Ers" handelt es sich beim Rest nur um Skalare, deshalb müsste es doch klappen
Name Size Bytes Class Attributes
A 253071x2 4049136 double
A9 253071x1 2024568 double
Ers 253071x1 2024568 double
Fn 1x1 8 double
L 1343x298 400214 logical
Ma19 253071x1 2024568 double
Ma9 253071x1 2024568 double
R 1x1 8 double
T 1x1343 10744 double
T0 1x1 8 double
T19 1x1 8 double
T9 253071x1 2024568 double
Tmax 1x1 8 double
Tt19 253071x1 2024568 double
X 1343x298 3201712 double
X_filtered 253071x1 2024568 double
Y 1343x298 3201712 double
Y_filtered 253071x1 2024568 double
ans 0x0 112 sym
c0 1x1 8 double
cp 1x1 8 double
dp 1x1 8 double
dt 1x1 8 double
idx 253071x1 253071 logical
k 1x1 8 double
m0 1x1 8 double
my 1x1 8 double
p 1x298 2384 double
p0 1x1 8 double
p19 1x1 112 sym
p9 253071x1 2024568 double
pmax 1x1 8 double
pt19 253071x1 2024568 double
w19 253071x1 2024568 double
w9 253071x1 2024568 double
Danke nochmal Harald
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 23.12.2012, 23:53
Titel:
|
 |
Hallo,
Zitat: |
Nur beim ersten Teil hapert es schon,... |
Was machst du denn für diesen ersten Teil?
Zitat: |
Gebe ich die Werte aber von Hand ein in die Formel |
Was heißt das? Dass du mit Zahlenwerten statt Variablen arbeitest? Nun, wundert mich nicht weiter.
In einem anderen Beitrag hat dir ja auch MaFaM geschrieben, dass es hierfür keine explizite, symbolische Lösung gibt. Und wenn es keine gibt, kann auch MATLAB keine finden.
Ich würde wie anfangs vorgeschlagen fsolve statt solve verwenden, also einen numerischen Ansatz statt des symbolischen.
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.01.2013, 16:06
Titel:
|
 |
Entschuldigung für meine verspätete Antwort, die Weihnachtsfeiertage und eine Grippe hatten mich niedergerungen
Nochmal zurück zum Thema:
Zitat: |
Ich würde wie anfangs vorgeschlagen fsolve statt solve verwenden, also einen numerischen Ansatz statt des symbolischen. |
Ich löse quasi die Gleichung nun numerisch nach dem ersten Element vom Vektor "Ers".
Auch das will nicht klappen, oder habe ich den Code falsch eingegeben?
Könnte das vielleicht jemand korrigieren bzw. mal ausprobieren? das wäre sehr nett!
Alternativ: Muss ich sonst mit einem Nullstellenverfahren arbeiten?
Gruß und Danke
Schmankerl
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 07.01.2013, 22:48
Titel:
|
 |
Hallo,
schau dir doch mal die Syntax und Beispiele von fsolve in der Hilfe an.
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.01.2013, 09:46
Titel:
|
 |
|
 |
|
Das liefert mir also für Ers(1) (Element 1 vom Vektor Ers) das Ergebnis:
Z =
0.0235
für Ers(2000) wird
Z =
0.0236 ausgegeben.
Dabei wird jeweils angezeigt:
Zitat: |
fsolve stopped because the relative size of the current step is less than the default value of the step size tolerance squared and the vector of function values
is near zero as measured by the default value of the function tolerance. |
Dürfte etwas mit der Schrittweise für die nächste Iteration zu tun haben?
Was ich nun möchte, dass mir alle Ergebnisse von Ers(1) bis Ers(253071) angezeigt werden und als Vektor Z gespeichert werden.
Das habe ich dann einfach so probiert: Klammer von Ers weglassen
Ich erhalte dann eine Fehlermeldung
Zitat: |
Warning: Trust-region-dogleg algorithm of FSOLVE cannot handle non-square systems; using Levenberg-Marquardt
algorithm instead.
> In fsolve at 324
In Test at 78
No solution found.
fsolve stopped because the problem appears regular as measured by the gradient,
but the vector of function values is not near zero as measured by the
default value of the function tolerance.
<stopping criteria details>
Z =
0.0235
fsolve stopped because the sum of squared function values, r, has gradient with
relative norm 9.358241e-015; this is less than 1e-4*options.TolFun = 1.000000e-010.
However, r = 2.740726e+008, exceeds sqrt(options.TolFun) = 1.000000e-003.
Optimization Metric Options
norm(grad r) = 9.36e-015 1e-4*TolFun = 1e-010 (default)
r = 2.74e+008 |
Hat wohl auch etwas mit Schrittweite zu tun?
Wie kann ich dem abhelfen, weil wenn ich einzeln den Vektor Ers durchgehe und lösen lasse klappt es ja?
Danke nochmal Harald!
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.01.2013, 12:11
Titel:
|
 |
Anmerkung:
Habe das gerade mit einer Schleife probiert, dann klappt es, nur es rechnet ewig lang...es müsste doch auch mit "logical indexing" funktionieren, um es ein wenig schneller zu machen?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.01.2013, 19:56
Titel:
|
 |
Hallo,
was heißt denn "ewig lang"? Sekunden, Minuten, Stunden, Tage?
In dem Fall halte ich die for-Schleife für sinnvoller, da MATLAB sonst versucht, ein p19 zu finden, das alle Gleichungen möglichst gut erfüllt.
Logical indexing macht hier keinen Sinn.
Weitere Optimierungsmöglichkeiten:
- Startwert abhängig von Ers wählen. Falls die Ers sortiert sind, kann es sinnvoll sein, das eine Ergebnis als Startwert für die nächste Suche zu verwenden.
- exitflag zurückgeben lassen. Falls exitflag <= 0 ist der Algorithmus nicht konvergiert, und die "Lösung" ist keine.
- über optimset 'Display' auf 'off' stellen, da du sonst in jeder Iteration die Information ins Command Window geschrieben bekommst und das so unnötig länger dauert.
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.01.2013, 22:39
Titel:
|
 |
|
 |
|
Hmm für meine Berechnung dauert das wohl an die 15min?
Dachte das kann man noch irgendwie beschleunigen.
Ist es richtig, dass ich als Exitflag nur ein Skalar bekomme? In meinem Fall 2.
Und was ich nicht ganz verstanden habe, was fval angibt, die Toleranz nach der die Iteration abgebrochen wird?Habe das in der help nicht ganz verstanden.
Gut also mit der Schleife klappt das zumindest.Danke!
Nun noch meine abschließende Frage:
Ich möchte noch folgendes einbauen (siehe oben):
Zitat: |
Zitat: |
Was hat Ma19 mit p19 zu tun? |
Angenommen es ist:
und dann soll die Rechnung nur ausgeführt werden, wenn
Ma19>1 ist, also für ZEILE 2 und 3
Für Zeile 2 und 3 soll der Wert von p19 neu berechnet werden, für Zeile 1 soll der Wert 0.5 beibehalten werden. Dabei soll jeweils mit den Elementen 2 und 3 des Vektors Ers gerechnet werden.
Hoffe jetzt ist es verständlicher? |
Ich möchte nun also,dass die Rechnung nur dann ausgeführt wird, für die Elemente vom Vektor "Ers" , bei denen beim Vektor "Ma19" (gleich groß) gilt : Ma19>1.
Für diese Elemente soll die Gleichung nach p19 gelöst werden, und der Vektor p19 damit an entsprechenden Stellen überschrieben werden.
Daran versuche ich mich gerade noch...muss ich dann anstatt mit "for Schleife" mit "if Bedingung " arbeiten?
Quasi:
Ich glaube aber das haut jetzt nicht hin? Wäre toll wenn du mir dabei nochmal helfen könntest
Dankeschön
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 08.01.2013, 23:28
Titel:
|
 |
Hallo,
etwa so:
(ungetestet)
Grüße,
Harald
|
|
|
Schmankerl |
Themenstarter

Forum-Fortgeschrittener
|
 |
Beiträge: 77
|
 |
|
 |
Anmeldedatum: 05.12.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.01.2013, 12:50
Titel:
|
 |
Es scheint noch nicht 100% tig zu funktionieren
Ich habe zum Testen einmal die Werte für
Ma19(100)=0.5;
Ma19(1000)=0.5;
vorgegeben. Laut Bedingung müsste hier sein:
p19=p0; (p0=0.3)
Da nur falls Ma19>1 ist, der Wert für p19 neu berechnet werden soll,hier ist er aber jeweils 0,5 und damit kleiner 1.
Als Ergebnis erhalte ich einen Vektor p19 bei dem an der Stelle 100 und 1000 der Wert 0 erscheint, anstatt dem Wert p0=0.3
Alle anderen Werte, werden korrekt überschrieben.
1) Woran liegt das, sehe den Fehler im Programm leider nicht. Im Anhang findet sich mein ganzes Programm nochmals.
2) Wenn NaN erscheint, konvergiert die Lösung dann nicht?
Beschreibung: |
|
 Download |
Dateiname: |
Tester.m |
Dateigröße: |
3.66 KB |
Heruntergeladen: |
376 mal |
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 09.01.2013, 20:05
Titel:
|
 |
Hallo,
ich habe Schwierigkeiten, die Problembeschreibung nachzuvollziehen.
zu 1)
Was mir aufgefallen ist:
Du meinst wohl
oder so etwas?
Ebenso in der Zeile darunter.
Hier wird p19 überschrieben, ohne dass vorher etwas damit gemacht wurde.
zu 2)
Genau.
Grüße,
Harald
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|