|
|
| Hard Harry |

Forum-Anfänger
|
 |
Beiträge: 24
|
 |
|
 |
Anmeldedatum: 12.10.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.10.2011, 10:00
Titel: Numerischer Fehler
|
 |
Hallo ihr Spezialisten,
Ich habe das folgende Problem:
1. Die Matrix "Fehlerquadrat" müsste eine Nullmatrix sein, die Berechnung läuft vlt. irgendwie falsch ab! Numerischer Fehler? Was kann ich tun?
2.Wie könnte ich die Rechengeschwindigkeit optimieren?
Eventuell Speicher für Matritzen reservieren? Wie funktioniert das hier?
|
|
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 16.10.2011, 10:25
Titel: Re: Numerischer Fehler
|
 |
Hallo Hard Harry,
| Zitat: |
| 1. Die Matrix "Fehlerquadrat" müsste eine Nullmatrix sein, die Berechnung läuft vlt. irgendwie falsch ab! Numerischer Fehler? Was kann ich tun? |
Dazu kann ich nicht sagen, weil ich nicht weiß, was Du genau berechnen möchtest.
Eventuell müssen noch die Zeilen- oder Spalten-Ausrichtungen der Vektoren angepasst werden.
Soll die Zeile "k = Ia + (Ie-Ia)*rand(j,1);" vielleicht so heißen: "k(j) = Ia + (Ie-Ia)*rand;" ?
Ich habe hauptsächlich wiederholte Berechnungen vermieden, die FOR-Schleife durch SUM ersetzt und die Determinante direkt berechnet. Das spart einen Funktionsaufruf und das Erstellen einer 2x2-Matrix. Das Umstellen der Terme in a(j) und b(j) bringt auch etwas: "-1/detA * (-x + y)" enthält 5 Operatoren, "(x - y) / detA" enthält nur 2.
"a * a" ist schneller als "a ^2".
Gruß, Jan
Zuletzt bearbeitet von Jan S am 16.10.2011, 12:24, insgesamt einmal bearbeitet
|
|
|
|
| Hard Harry |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 24
|
 |
|
 |
Anmeldedatum: 12.10.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.10.2011, 10:51
Titel:
|
 |
Beim Durchlauf des Programms tritt in der Zeille
ein Fehler auf! Die Matrixdimensionen würden nicht übereinstimmen.Was kann man da machen?
Ia,Ie heißt das ich Zufallszahlen zwischen den Intervallgrenzen erzeuge. Diese habe ich aus Ia=Ie=1 gesetzt damit k=1 ist. Somit ist das Ergebniss der Fehlerquadrate auch gleich 0. Ist für den reinen Testzweck.
Du hast es richtig erkannt, das muss so heißen: k(j) = Ia + (Ie-Ia)*rand;
Danke für die schnelle Hilfe und für die wertvollen Tipps.
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 16.10.2011, 12:28
Titel:
|
 |
Hallo Hard Harry,
So läuft's:
Nun, hübscher ist es schon, aber zumindest unter Matlab 2011b langsamer. Ich versuche es nochmal:
Ja, das Vektorisieren lohnt sich bei den kleinen Arrays nicht.
Deine Orginal-Version benötigt unter 2011b 0.0059 sec, meine vektorisierte Version 0.010 sec, und die bereinigte FOR-Schleifen Version 0.00057. Die Pre-allocation ist wohl am wichtigsten. Das Mutliplizieren ist schneller als das Dividieren, deshalb habe ich "divA = 1 / detA" einmal berechnet, um später 2 mal multiplizieren zu können.
Gruß, Jan
|
|
|
|
|
|
|
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.
|
|