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

[symbolic math] solve-Problem

 

Fabse
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.07.15
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 04.08.2015, 17:19     Titel: [symbolic math] solve-Problem
  Antworten mit Zitat      
Hallo,
wer weiß Rat?

Über folgendes Problem bin ich gestolpert: ich habe eine (nicht zu wilde) Funktion u (s.u.), von deren Ableitung ich eine Funktion der realwertigen Nullstellen bekommen möchte. Leider bekomme ich nur komplexwertige... Die Zeichnungen zeigen aber dass realwertige existieren.


Das Skript unten plottet die Funktionen u und die Ableitung dudr um so zu checken, dass alles richtig läuft und das Nullstellen tatsächlich existieren (tun sie). Die dudr-Funktion geht über einen sehr weiten Bereich mit "recht eng liegenden" Nullstellen, ist das ein Problöem für den Solver (sigma-Werte ~e-11, r-Werte ~e-6)?

Code:

clear all
syms r
syms sigma

u=1./r.*(1-exp(-r.^2/(sigma)))
hfunc_u= matlabFunction(u);
figure;
for sigmai=3.5e-11:3.5e-11:280e-11
    plot(feval(hfunc_u,10e-6:5e-6:1e-3,sigmai));
    hold on;
end;

dudr=diff(u,r)
hfunc_Deriv= matlabFunction(dudr);
figure;
for sigmai=3.5e-11:3.5e-11:280e-11
    plot(feval(hfunc_Deriv,10e-6:5e-6:1e-3,sigmai));
    hold on;
end;

Loesung=solve(dudr) %<--- nur komplexe Werte, eigenartigerweise nicht von sigma abhängig
Loesung=solve(dudr,'Real',true) %<--- empty Matrix

 
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.08.2015, 18:19     Titel:
  Antworten mit Zitat      
die funktion siht mir irgendwie für x~=0 streng monoton fallend aus. ich wüsste nicht warum da die ableitung nullstellen haben sollte aber ich mag mich da auch irren. deine plots sind irgendwie auch sehr komisch.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Fabse
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.07.15
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 04.08.2015, 18:53     Titel:
  Antworten mit Zitat      
Die Ableitung hat definitiv Nullstellen (evtl liegt für Matlab aber das Problem da, dass wenn in der Kurvenschar sigma --> 0 die Nullstellen unendlich weit an die Stelle r=0 ranrücken?).

Dass die Funktion dudr eine Nullstelle haben muss erkennt man an den Figures, oder auch mit folgender Überlegung (halten wir mal sigma fest):

u(r) >= 0 für alle r
u(r-->unendlich) --> 0
Dazu ist die Steigung von u an der Stelle r=0 größer als Null - als Beweis: Taylor-Entwicklung an der Stelle r=0: dudr(r=0) ~= 1/r * 2r/sigma = 1/sigma >0

Das heißt irgendwo muss die Steigung negativ werden, damit die Funktion für r --> unendlich "von oben" gegen Null laufen kann.


Du traust den Figures nicht - die sind definitv korrekt (hab es ohne sym-Box numerisch gegengecheckt). Vielleicht siehts weniger komisch aus wenn man die sigma-Auflösung etwa um den Faktor 50 zu erhöht, also: sigmai=3.5e-11:3.5e-11/50:280e-11
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 04.08.2015, 18:57     Titel:
  Antworten mit Zitat      
Zitat:
Dazu ist die Steigung von u an der Stelle r=0 größer als Null -

an der stelle ist die funktion nicht definiert. irgendwelche aussagen über ihre steigung an der stelle zu treffen halte ich für nicht sinnvoll.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.08.2015, 19:58     Titel:
  Antworten mit Zitat      
Hallo,

ich kann das Verhalten nicht reproduzieren und bekomme eine andere Lösung.

Empfehlenswert ist nicht zuletzt, auch die Variable anzugeben, nach der gelöst werden soll.

Code:
Loesung=solve(dudr, r)
Loesung =
 
 -(2^(1/2)*(-sigma*(2*lambertw(1, -exp(-1/2)/2) + 1))^(1/2))/2
  (2^(1/2)*(-sigma*(2*lambertw(1, -exp(-1/2)/2) + 1))^(1/2))/2


Mehr kann man da auch nicht wirklich erwarten, da eine solche Gleichung allgemein keine explizite Lösung hat (und dann kann natürlich MATLAB auch keine finden).

Falls du eine ältere Version als R2015a nutzt, bitte dies bei der Frage angeben oder am besten im Profil eintragen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.07.15
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 04.08.2015, 23:29     Titel:
  Antworten mit Zitat      
Hallo nochmal und danke Harald das ist was ich wollte.
Aber ein kleines Problemchen besteht immer noch: die Loesungsfunktion zu dudr=0 ist ja ersteinmal komplexwertig, es sollen aber nur realwertige r zugelassen werden. Da die Lösungsfunktion ja auch die r-Lage der Extremwerte (und in diesem Fall die Maximalwerte) angibt, kann man sich an Hand des Plots überzeugen, dass es auch Nullstellen für realwertige r geben muss.

Unten habe ich noch mal das entschlackte Skript das ja eigentlich funktionieren sollte angefügt. Es wird neben der Kurvenschar u_sigma(r) auch die Lösungskurve u(rmax(sigma)) geplottet. Irgendwas stimmt aber mit der roten Lösungskurve immer noch nicht - sie liegt nicht auf den Maxima der blauen Kurvenschar sondern irgendwie verschoben (man beachte die ersten beiden +-markierten Punkte der roten Kurve) .... Ein Verwenden nur des abs()-Teils oder nur des real()-Teils verschiebt die Kurve aber auch nicht an die richtige Position Sad

Was mach ich falsch?

Code:

    clear all
    syms r
    syms sigma
   
    t2sigmaFac=4*0.95e-6;
    tvec=1e-6:10e-6/10:200e-6; %Aus dem tvec wird der Scharparameter sigma gewonnen gemäß sigma:=tvec*t2sigmaFac
    rvec=1e-7:2e-7:100e-6;
   
    u=1./r.*(1-exp(-r.^2/(sigma)))
    hfunc_u= matlabFunction(u);
   
    %Zeichne Kurvenschar u_sigma(r)
    figure;
    for i=tvec
        plot(rvec,feval(hfunc_u,rvec,i*t2sigmaFac));
        hold on;
    end;
   
    %Ableitung nach r von u bilden um dann Maximal- (bzw Extrem) Werte zu bestimmen
    dudr=diff(u,r)
    hfunc_Deriv= matlabFunction(dudr);
   
    Loesung=solve(dudr,r,'Real',true) %finde die realwertige Funktion der Nullstellen -> keine Lsg.
    Loesung=solve(dudr,r)
    Loesung=Loesung(1); %Nur oberer Ast der Lambert w Fkt (Bei mir liegt der obere Ast in Loesung(1) bei Matlab 2015 scheint der in Loesung(2) zu liegen?)
    hfunc_Nullstellen=matlabFunction(Loesung); %function handle auf Nullstellenfunktion
   
    rmax_sigma=feval(hfunc_Nullstellen,tvec*t2sigmaFac); %r-Werte zu den Nullstellen, also r_max(sigma)
    u_rmax_sigma=feval(hfunc_u,(rmax_sigma),tvec*t2sigmaFac); %entsprechende Werte u(r_max(sigma))
    plot((rmax_sigma),(u_rmax_sigma),'r');


Kurvenschar_Und_Loesungkl.png
 Beschreibung:

Download
 Dateiname:  Kurvenschar_Und_Loesungkl.png
 Dateigröße:  94.53 KB
 Heruntergeladen:  526 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.08.2015, 07:33     Titel:
  Antworten mit Zitat      
Hallo,

anfangs die Variablen als reell definieren hilft:
Code:


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 17.07.15
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 05.08.2015, 09:48     Titel:
  Antworten mit Zitat      
Danke Harald, so klappts bei mir auch Very Happy!
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 - 2024 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.