WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Nullstellenberechnung mit komplexen Zahlen

 

Nikolai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2010, 16:12     Titel: Nullstellenberechnung mit komplexen Zahlen
  Antworten mit Zitat      
Hey,

ich habe folgendes Problem:
Ich möchte die Nullstelle einer Gleichung bestimmen.
Normalerweise würde sich hierbei die fzero-Funktion (Brent-Algo) anbieten, das Problem ist aber, dass komplexe Zahlen in meiner Gleichung vorkommen, womit die fzero-Funktion hinfällig wäre.

Hat jemand einen Vorschlag?

Beste Grüße,
Nikolai


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2010, 16:21     Titel:
  Antworten mit Zitat      
Hallo,

Eine Idee:
Verwendung von fsolve mit unbekanntem x = a + b*i (a, b reellwertig).

Zwei Gleichungen:
real(f(x)) = 0
imag(f(x)) = 0

Für genauere Informationen müsste man mal die Gleichung sehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikolai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.01.2010, 21:30     Titel:
  Antworten mit Zitat      
Guten abend,


ich habe versucht deinen Ratschlag nachzuvollziehen und es könnte klappen. Ich habe eine Funktion Differenz(epsilon, k) geschrieben. Differenz ist lediglich von epsilon abh. und k spiegelt praktisch die k-te Differenz wieder.

Wie schaut dann die Funktion mit fsolve im Komplexen aus, so wie du sie vorgeschlagen hast. Bring das leider selbst nicht hin?


Merci,
Niko
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.01.2010, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

was soll die k-te Differenz sein?

Idee: f(x) = 0 mit x, f komplexwertig
->
Code:
function fx = gleichung(x)
ReX = x(1);
ImX = x(2);
fx(1) = real(f(ReX + i*ImX));
fx(2) = imag(f(ReX + i*ImX));
fx = fx';


und dann
Code:
x = fsolve(@gleichung, [0; 0]);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikolai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2010, 11:10     Titel:
  Antworten mit Zitat      
Moin,

mit k-te Differenz meine ich, dass ich n verschiedene Differenzen habe(also praktisch einen Vektor von Differenzen). Aber für den Anfang bleiben wir am besten bei einer Differenz.

Ich verstehe deine Funktion leider immernoch nicht ganz.

Ich versuchs mal zu interpretieren:

- x ist ein Vektor der Länge 2, also komplex.
- ReX ist das erste Element des Vektors, sprich der Realteil
- ImX ist das zweite Element des Vektors, sprich der Imaginärteil

- fx wird dann praktisch in Real- und Imaginärteil zerlegt
Hier verstehe ich nicht ganz, was f bedeutet, bzw. wo du das her nimmst.


Viele Grüße,
Niko
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2010, 11:32     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
mit k-te Differenz meine ich, dass ich n verschiedene Differenzen habe(also praktisch einen Vektor von Differenzen). Aber für den Anfang bleiben wir am besten bei einer Differenz.


Mit anderen Worten: ein komplex-wertiges Gleichungssystem. Dann müsste man zu jeder Gleichung den von mir beschriebenen Prozess durchführen.

Zitat:
Hier verstehe ich nicht ganz, was f bedeutet, bzw. wo du das her nimmst.

Das ist die Gleichung, die du lösen möchtest: f(x) = 0.

Ein konkretes Beispiel:
Code:
function fx = gleichung(x)

% Hier: löse x^2 - i = 0
ReX = x(1);
ImX = x(2);
f = (ReX + 1i*ImX)^2 - 1i;
fx(1) = real(f);
fx(2) = imag(f);
fx = fx';


Aufruf:
Code:
x = fsolve(@gleichung, [1 1])
z = x(1) + x(2)*i % z ist dann die eigentliche Lösung
z^2


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikolai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2010, 13:36     Titel:
  Antworten mit Zitat      
Hey,

danke für deine Hilfe.
Ich habs geschafft umzusetzen.
Die Ergebnisse lassen aber zu wünschen übrig.

Das Problem ist, dass einmal eine negative Wurzel vorkommt, deshalb die komplexen Zahlen. Rauskommen soll aber eine reele Zahl.
Am besten wird sein, die Wurzel mit einer Näherung zu berechnen.
Aber das ist ein rein mathematisches Problem.


Vielen Dank,
Niko
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2010, 13:40     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Ergebnisse lassen aber zu wünschen übrig.

Das liegt vermutlich daran, dass fsolve ein lokales Minimum sucht. Man braucht also einen halbwegs guten Startwert.

Zitat:
Das Problem ist, dass einmal eine negative Wurzel vorkommt, deshalb die komplexen Zahlen. Rauskommen soll aber eine reele Zahl.

Diese Logik kann ich leider nicht nachvollziehen. Was denn nun?

Am einfachsten wäre wahrscheinlich, wenn du mal die Gleichung zur Verfügung stellst, die du lösen möchtest, und dazu sagst, wie die Lösung aussehen soll.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikolai

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2010, 15:14     Titel:
  Antworten mit Zitat      
Hey,


tut mir leid, da hab ich mich wohl etwas unverständlich ausgedrückt.

Also meine Gleichung schaut vereinfacht so aus:

int (N(x-epsilon)*c*exp(d*epsilon+sqrt(4*x)),x,-2, 100) = D

- N = kumulative Normalverteilung
- c, d sind Konstanten
- int steht für Integral mit Grenzen -2 und 100 (es wird nach x integriert)
- D ist gegeben
- epsilon ist gesucht und soll reel sein

-> und hier ist das Problem: sqrt(4*x) ist komplex zwischen -2 und 0

Damit ist mein eigentlicher Plan hinfällig.
Der war:
- numerisch integrieren
- fzero über int(...)-D

Nun ist es so, dass ich abschätzen kann was für epsilon rauskommen muss. Hab schon einiges ausprobiert.
- abs(int)
- dein Vorschlag
- sqrt(4*abs(x))

In diesem Fall gibt es keine exakte Lösung, vielmehr gilt es eine numerische Näherung zu finden.

Tut mir leid, wenn ich dich verwirrt habe. Bin eigentlich BWL und kein großer Programmierer.

Viele Grüße,
Niko
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.01.2010, 15:45     Titel:
  Antworten mit Zitat      
Hallo,

sind c, d, D reell? > oder < 0? Hast du vielleicht Beispielwerte für c, d und D?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.