|
|
Matrix/Nullstellen Problem |
|
Stephan83 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 10:48
Titel: Matrix/Nullstellen Problem
|
 |
|
 |
|
Guten Morgen,
bin noch ziemlich unerfahren(Anfänger) mit Matlab und arbeite mich Stück für Stück ein. Bin jetzt an einem Punkt angelangt, wo ich Eure Hilfe benötige.
Und zwar habe ich eine etwas komliziertere komplexe 2x2 Matrix erstellt mit der Variable "f". Aus der Matrix soll die Determinante gebildet werden. Anschließend soll diese zu Null gesetzt werden und sämtliche Nullstellen der Variable "f" sollen ausgegeben werden. Da die Werte der Matrix tan, sin, usw. enthalten kommen wohl unendlich viele Nulsstellen raus.
Hier mein Programm code: ("M" ist hierbei meine komplexe Matrix, "M1" die Determinante und die Variable"e" soll alle Nullstellen wiedergeben )
Als Lösung erhalte ich dann folgendes:
e =
matrix([[-2738.1785969727852105262081221762]])
Wenn ich einfache Zahlen eingebe klappt es.
Jetzt meine Fragen:
1. Ist der Code soweit in Ordnung oder gibt es bessere und schnelle Methoden?
2. Was bedeutet der Ausdruck der Lösung?
matrix([[-2738.1785969727852105262081221762]])
3. Kann man die Lösung für die Variable f eingerenzen (zum Beispiel zwischen 0 und 200)?
schonmal Danke im voraus
Gruß Stephan[/code]
|
|
|
|
|
bligg |

Forum-Anfänger
|
 |
Beiträge: 23
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 11:16
Titel:
|
 |
Brauchst du tatsächlich einen symbolischen Ausdruck in Abhängigkeit von f? Dann probier dein Glück mit einem Mathe-Programm, das direkt für symbolisches Rechnen ausgelegt ist.
Willst du einfach nur für verschiedene Werte von f die Ergebnisse haben? Dann dürfte
das richtige für dich sein?!
|
|
|
Gast |
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 11:48
Titel:
|
 |
|
 |
|
Also der symbolische Ausdruck ist für mich natürlich unwichtig.
Wie kann ich den Befehl eig() den einbauen?
etwa so?
Ergenis lautet dann:
M1 =
-(19*sin((36581*f)/25000000000)*i + 1187500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000)^2*i - 1187500*(- sin((36581*f)/25000000000)^2*tan((36581*f)/25000000000)^4 + (sin((36581*f)/25000000000)^2*tan((36581*f)/25000000000)^2)/31250 - sin((36581*f)/25000000000)^2/3906250000 - tan((36581*f)/25000000000)^2/976562500)^(1/2) - 500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000)*tan((14287*f)/1250000000)*i)/(9500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000))
-(19*sin((36581*f)/25000000000)*i + 1187500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000)^2*i + 1187500*(- sin((36581*f)/25000000000)^2*tan((36581*f)/25000000000)^4 + (sin((36581*f)/25000000000)^2*tan((36581*f)/25000000000)^2)/31250 - sin((36581*f)/25000000000)^2/3906250000 - tan((36581*f)/25000000000)^2/976562500)^(1/2) - 500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000)*tan((14287*f)/1250000000)*i)/(9500*sin((36581*f)/25000000000)*tan((36581*f)/25000000000))
Wie kann ich denn daraus die Variable "f" einfach und schnell berechnen?
|
|
|
bligg |

Forum-Anfänger
|
 |
Beiträge: 23
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 12:02
Titel:
|
 |
Soweit ich dein Problem verstehe, bist du auf der Suche nach den Eigenwerten deiner Matrix, richtig?
Dann erzeugst du deine Matrix (ganz ohne symbolisches Rechnen, einfach nur, indem du deine Matrix m für gegebenes f ausrechnest), und wendest darauf eig() wie in der Dokumentation erklärt an.
Deine Ergebnisse sind Eigenvektoren und Eigenwerte in der in der Dokumentation beschriebenen Form.
|
|
|
Gast |
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 12:42
Titel:
|
 |
eigendlich suche ich nicht direkt die eigenwerte sonden eher die Nullstellen von f nach dem ich die Determinante gebildet habe. Also wenn ich zum beispeil eine einefache 2x2 Matrix habe wie:
5*f 3
3*f 4*f
ist die Determinante ja:
D=20*f^2-9*f
Das ganze ist dann mit 0 gleichzusetzen:
20*f^2-9*f =0
und als nächstes soll die Variable "f" berechnet werden.
Als Ergebnis kommt 3/4 (symbolisch) und 0 raus
Symbolisch klappt das auch mit dem meinem ersten Code von mir. Nur sobald der Ausdruck in der Matrix komplizierter wird (mit sin, tan, 10x10 Matrix usw), kommt mist raus oder busy wird angezeigt oder die Rechnung dauert ne gute stunde.
eig() ergibt hierbei nicht meine gesuchten Nullstellen.
Wie gesagt mit würds ja schon reichen, wenn mein Code keine symbolischen Ergebnisse anzeigt sondern nur den Zahlenwert der Nullstelle.
|
|
|
bligg |

Forum-Anfänger
|
 |
Beiträge: 23
|
 |
|
 |
Anmeldedatum: 15.09.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 12:59
Titel:
|
 |
Oh, sorry, das mit dem Eigenwert war natürlich Blödsinn.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.500
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 14:06
Titel:
|
 |
Hallo,
Zitat: |
Dann probier dein Glück mit einem Mathe-Programm, das direkt für symbolisches Rechnen ausgelegt ist. |
Die Symbolic Math Toolbox ruft intern einen MuPAD-Kernel auf und ist für symbolisches Rechnen ausgelegt. Bessere Ergebnisse wird man in anderen Sprachen nur in Einzelfällen erhalten.
Wenn es letztlich um eine numerische Lösung geht (und bei der Komplexität der Aufgabenstellung macht wohl nichts anderes sinn), sollte man das auch numerisch angehen:
|
|
|
Stephan83 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 22.09.2010, 14:22
Titel:
|
 |
Hallo Harald,
danke erstmal. Genau das was ich suche. Nur zeigt die Lösung mir nur eine Nullstelle an. Was muss ich am Code verändern damit z.B. die ersten 10 Nullstellen dargestellt werden.
|
|
|
Stephan83 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 08:45
Titel:
|
 |
|
 |
|
Hallo,
habe nun ein Programm geschrieben, welches mir aus einer 21x21 matrix die Determinante mit der Variable f berechnet. Anschließen sollen die Nullstellen von berechnet werden.
z_u45=19;
t_u45=10*10^-6;
z_u23=19;
t_u23=10*10^-6;
z_u22=19;
t_u22=10*10^-6;
z_netzwest=19;
t_netzwest=10*10^-6;
z_322=19;
t_322=10*10^-6;
z_16=19;
t_16=10*10^-6;
z_24=19;
t_24=10*10^-6;
z_29=19;
t_29=10*10^-6;
z_netzost=19;
t_netzost=10*10^-6;
z_u21=19;
t_u21=10*10^-6;
z_521=19;
t_521=10*10^-6;
z_u1=19;
t_u1=10*10^-6;
z_u2=19;
t_u2=10*10^-6;
z_422=19;
t_422=10*10^-6;
z_312=19;
t_312=10*10^-6;
z_12=250;
t_12=5*10^-6;
z_23=250;
t_23=5*10^-6;
z_34=250;
t_34=5*10^-6;
z_45=250;
t_45=5*10^-6;
z_56=250;
t_56=5*10^-6;
z_510=250;
t_510=5*10^-6;
z_67=250;
t_67=5*10^-6;
z_89=250;
t_89=5*10^-6;
z_910=250;
t_910=5*10^-6;
z_1011=250;
t_1011=5*10^-6;
z_1112=250;
t_1112=5*10^-6;
z_1213=250;
t_1213=5*10^-6;
z_1314=250;
t_1314=5*10^-6;
z_1415=250;
t_1415=5*10^-6;
z_1516=250;
t_1516=5*10^-6;
z_1617=250;
t_1617=5*10^-6;
z_1718=250;
t_1718=5*10^-6;
z_1819=250;
t_1819=5*10^-6;
z_1920=250;
t_1920=5*10^-6;
z_2021=250;
t_2021=5*10^-6;
syms f
for k=10000:1000:500000
%Matrix 21x21
M=@(f) det([ i.*tan(2.*pi.*f.*t_u45)./z_u45+1./(i.*z_12.*tan(2.*pi.*f.*t_12)), -1/(i.*z_12.*sin(2.*pi.*f.*t_12)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
-1/(i.*z_12.*sin(2.*pi.*f.*t_12)), i.*tan(2.*pi.*f.*t_u23)./z_u23+1./(i.*z_12.*tan(2.*pi.*f.*t_12))+1./(i.*z_23.*tan(2.*pi.*f.*t_23)), -1/(i.*z_23.*sin(2.*pi.*f.*t_23)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, -1/(i.*z_23.*sin(2.*pi.*f.*t_23)), i.*tan(2.*pi.*f.*t_u22)./z_u22+1./(i.*z_23.*tan(2.*pi.*f.*t_23))+1./(i.*z_34.*tan(2.*pi.*f.*t_34)), -1/(i.*z_34.*sin(2.*pi.*f.*t_34)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, -1/(i.*z_34.*sin(2.*pi.*f.*t_34)), i.*tan(2.*pi.*f.*t_netzwest)./z_netzwest+1./(i.*z_34.*tan(2.*pi.*f.*t_34))+1./(i.*z_45.*tan(2.*pi.*f.*t_45)), -1/(i.*z_45.*sin(2.*pi.*f.*t_45)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, -1/(i.*z_45.*sin(2.*pi.*f.*t_45)), 1./(i.*z_45.*tan(2.*pi.*f.*t_45))+1./(i.*z_56.*tan(2.*pi.*f.*t_56))+1./(i.*z_510.*tan(2.*pi.*f.*t_510)), -1/(i.*z_56.*sin(2.*pi.*f.*t_56)), 0, 0, 0, -1/(i.*z_510.*sin(2.*pi.*f.*t_510)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, -1/(i.*z_56.*sin(2.*pi.*f.*t_56)), i.*tan(2.*pi.*f.*t_322)./z_322+1./(i.*z_56.*tan(2.*pi.*f.*t_56))+1./(i.*z_67.*tan(2.*pi.*f.*t_67)), -1/(i.*z_67.*sin(2.*pi.*f.*t_67)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, -1/(i.*z_67.*sin(2.*pi.*f.*t_67)), i.*tan(2.*pi.*f.*t_16)./z_16+1./(i.*z_67.*tan(2.*pi.*f.*t_67)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, i.*tan(2.*pi.*f.*t_24)./z_24+1./(i.*z_12.*tan(2.*pi.*f.*t_12)), -1/(i.*z_89.*sin(2.*pi.*f.*t_89)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, -1/(i.*z_89.*sin(2.*pi.*f.*t_89)), i.*tan(2.*pi.*f.*t_29)./z_29+1./(i.*z_89.*tan(2.*pi.*f.*t_89))+1./(i.*z_910.*tan(2.*pi.*f.*t_910)), -1/(i.*z_910.*sin(2.*pi.*f.*t_910)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, -1/(i.*z_510.*sin(2.*pi.*f.*t_510)), 0, 0, 0, -1/(i.*z_910.*sin(2.*pi.*f.*t_910)), 1./(i.*z_910.*tan(2.*pi.*f.*t_910))+1./(i.*z_1011.*tan(2.*pi.*f.*t_1011))+1./(i.*z_510.*tan(2.*pi.*f.*t_510)), -1/(i.*z_1011.*sin(2.*pi.*f.*t_1011)), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1011.*sin(2.*pi.*f.*t_1011)), i.*tan(2.*pi.*f.*t_netzost)./z_netzost+1./(i.*z_1011.*tan(2.*pi.*f.*t_1011))+1./(i.*z_1112.*tan(2.*pi.*f.*t_1112)), -1/(i.*z_1112.*sin(2.*pi.*f.*t_1112)), 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1112.*sin(2.*pi.*f.*t_1112)), i.*tan(2.*pi.*f.*t_u21)./z_u21+1./(i.*z_1112.*tan(2.*pi.*f.*t_1112))+1./(i.*z_1213.*tan(2.*pi.*f.*t_1213)), -1/(i.*z_1213.*sin(2.*pi.*f.*t_1213)), 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1213.*sin(2.*pi.*f.*t_1213)), i.*tan(2.*pi.*f.*t_521)./z_521+1./(i.*z_1213.*tan(2.*pi.*f.*t_1213))+1./(i.*z_1314.*tan(2.*pi.*f.*t_1314)), -1/(i.*z_1314.*sin(2.*pi.*f.*t_1314)), 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1314.*sin(2.*pi.*f.*t_1314)), 1./(i.*z_1314.*tan(2.*pi.*f.*t_1314))+1./(i.*z_1415.*tan(2.*pi.*f.*t_1415)), -1/(i.*z_1415.*sin(2.*pi.*f.*t_1415)), 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1415.*sin(2.*pi.*f.*t_1415)), 1./(i.*z_1415.*tan(2.*pi.*f.*t_1415))+1./(i.*z_1516.*tan(2.*pi.*f.*t_1516)), -1/(i.*z_1516.*sin(2.*pi.*f.*t_1516)), 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1516.*sin(2.*pi.*f.*t_1516)), i.*tan(2.*pi.*f.*t_u1)./z_u1+1./(i.*z_1516.*tan(2.*pi.*f.*t_1516))+1./(i.*z_1617.*tan(2.*pi.*f.*t_1617)), -1/(i.*z_1617.*sin(2.*pi.*f.*t_1617)), 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1617.*sin(2.*pi.*f.*t_1617)), i.*tan(2.*pi.*f.*t_u2)./z_u2+1./(i.*z_1617.*tan(2.*pi.*f.*t_1617))+1./(i.*z_1718.*tan(2.*pi.*f.*t_1718)), -1/(i.*z_1718.*sin(2.*pi.*f.*t_1718)), 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1718.*sin(2.*pi.*f.*t_1718)), 1./(i.*z_1718.*tan(2.*pi.*f.*t_1718))+1./(i.*z_1819.*tan(2.*pi.*f.*t_1819)), -1/(i.*z_1819.*sin(2.*pi.*f.*t_1819)), 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1819.*sin(2.*pi.*f.*t_1819)), 1./(i.*z_1819.*tan(2.*pi.*f.*t_1819))+1./(i.*z_1920.*tan(2.*pi.*f.*t_1920)), -1/(i.*z_1920.*sin(2.*pi.*f.*t_1920)), 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_1920.*sin(2.*pi.*f.*t_1920)), i.*tan(2.*pi.*f.*t_422)./z_422+1./(i.*z_1920.*tan(2.*pi.*f.*t_1920))+1./(i.*z_2021.*tan(2.*pi.*f.*t_2021)), -1/(i.*z_2021.*sin(2.*pi.*f.*t_2021));
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1/(i.*z_2021.*sin(2.*pi.*f.*t_2021)), i.*tan(2.*pi.*f.*t_312)./z_312+1./(i.*z_2021.*tan(2.*pi.*f.*t_2021))
]);
fzero(M, k)
end
Leider gibt das Programm mir folgenden Fehler aus:
??? Error using ==> fzero at 334
Funktion value at starting guess must be finite and real
Was bedeutet die Fehlermeldung? Und weiss jemand evtl. was ich falsch gemacht habe?
danke schonmal
|
|
|
Stephan83 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 10:31
Titel:
|
 |
Habt den fehler gefunden. Matrixist ungerade deswegen ist das Ergebnis kompex.
Hat fzero propleme mit komplexen Werten? Wenn ich die Matrix auf
20 X 20 reduziere funktioniert fzero.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.500
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 29.09.2010, 19:14
Titel:
|
 |
Hallo,
fzero ist nur für reellwertige Funktionen gedacht und sucht eine Nullstelle in der Nähe des Startwertes. Wenn du mehrere Nullstellen brauchst, brauchst du mehrere Startwerte.
Gute Startwerte könntest du z.B. bekommen, in dem du das auf einem Gitter auswertest und die Vorzeichenwechsel als Startwerte nimmst.
Etwa so:
Grüße,
Harald
|
|
|
|
|
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.
|
|