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

besseli berechnet Inf

 

elchico
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 04.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2020, 14:35     Titel: besseli berechnet Inf
  Antworten mit Zitat      
Hallo zusammen,

ich nutze folgenden Code:

Code:

ans1 = besseli(0,besselArg);
ans2 = besseli(1,besselArg);
 


Bei einem besselArg von ca. 7e+02 + 6e+02i passt noch alles, bei einem Wert größer 700 für den Realteil (zB 800 + 1i) wird für beide Ergebnisse nur Inf + 0e+00i berechnet. Leider brauche ich für meine Berechnungen einen Realteil größer 700.
Jetzt bin ich echt kein bessel-Profi, das habe ich so aus dem Modell entnommen, welches zu berechnen ist.

Meine Frage: Wie kann ich in besseli größere Werte als 700 + xxx*i eingeben? Oder ist das aus irgendeinem mathematischen (mir unbekannten) Grund Schwachsinn und führt deswegen bei Matlab zu Inf?

Vielen Dank zusammen.
LG
Michi
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

die Zahlen, die mit Datentyp double darstellbar sind, sind begrenzt:

>> realmax("double")

ans =

1.7977e+308

Wenn das Ergebnis einer Berechnung größer wird, wird also inf angezeigt.

Ein Ausweg sind symbolische Berechnungen:
Code:
ans1 = vpa(besseli(0,sym(800)))
ans2 = vpa(besseli(1,sym(800)))

Allerdings musst du dann mit zunächst mit symbolischen Variablen weiterarbeiten.

Du kannst höchstens die Mantisse und den Exponenten trennen:
Code:
exponent = floor(double(log10(ans1)))
number = double(ans1/sym(10)^exponent)


Sind das Endergebnis denn tatsächlich so riesige Zahlen und werden beispielsweise zwei diesen großen Zahlen dividiert?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
elchico
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 04.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2020, 19:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

mal wieder: Vielen Dank, dass Du Dich meines kleinen Problems annimmst.

Siehe unten:
Leider ist x tatsächlich bis 150 groß. Das heißt, ich werde mich mal in die symbolischen Berechnungen einlesen. Habe zwar schon mal davon gehört, allerdings ist das noch Neuland für mich.

Das Problem ist die Summe von a4+a5, weswegen ich selbst mit ge"scale"ter besseli Funktion (Scaling mit 1) die ganze Sache nicht ge"rescale"d bekomme.

Danke!
LG
Michi

PS: Falls Du doch einen einfacheren Ausweg siehst als symbolische Berechnungen, bin ich natürlich offen dafür Wink

Beispielcode (ich hoffe, ich habe jetzt keine Fehler reingemacht):
Code:

% x im Bereich von 1 bis 150
x = 150;
S = (3 + 53i)
a1 = 3 + 50i
a2 = 0.06 + 0.003i
a3 = 0.9 - 0.003i
besselArg=x.*sqrt(S);
besselFrac=(besseli(0,besselArg)./besseli(1,besselArg));
a4 = 1000*S;
a5 = 0.5*besselArg.*besselFrac;

y = (1./a1).*(a2+(a3./(a4+a5)));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.08.2020, 20:42     Titel:
  Antworten mit Zitat      
Hallo,

gerne doch.
Hier brauchst du bloß an den richtigen Stellen hin- und zurückzuwandeln:

Code:
x = sym(150);
S = sym(3 + 53i)
a1 = 3 + 50i
a2 = 0.06 + 0.003i
a3 = 0.9 - 0.003i
besselArg=x.*sqrt(S);
besselFrac=double(besseli(0,besselArg)./besseli(1,besselArg));
a4 = double(1000*S);
a5 = double(0.5*besselArg.*besselFrac);

y = (1./a1).*(a2+(a3./(a4+a5)))


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
elchico
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 04.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2020, 17:14     Titel:
  Antworten mit Zitat      
Guten Morgen,

jo, ich wandle zwar an anderer Stelle um, aber es funktioniert jetzt echt gut. Lediglich die Performance ist miserabel (das kostet wohl viel Rechenpower), aber für die 5 % der Fälle, wo das der Fall ist, kann ich damit leben Wink

Vielen Dank.
LG
Michi

Code:

profile viewer
profile on
for ii = 150:150
    x = ii;
    S = (3 + 53i)
    a1 = 3 + 50i
    a2 = 0.06 + 0.003i
    a3 = 0.9 - 0.003i
    besselArg=x.*sqrt(S);
    besselFrac=(besseli(0,besselArg)./besseli(1,besselArg));
    besselFracSym=double(vpa(besseli(0,sym(besselArg))./besseli(1,sym(besselArg))));
    a4 = 1000*S;
    a5 = 0.5*besselArg.*besselFracSym;
    y = (1./a1).*(a2+(a3./(a4+a5)));
end
p = profile('info');
save (fullfile('C:\Users\LocalAdmin\Desktop','TimeProfiling.mat'), 'p');
profile off
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.08.2020, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

symbolisch ist in der Tat (deutlich) langsamer als numerisch.
Du kannst ja numerische Berechnungen und über eine if-Abfrage überprüfen, ob da inf oder NaN herauskommt. Falls ja, symbolisch "nachrechnen".
Vielleicht gibt es auch Gesetze über Quotienten von Bessel-Funktionen, da müsste man mal suchen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
elchico
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 04.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2020, 23:40     Titel:
  Antworten mit Zitat      
So habe ich es auch umgesetzt, jop. Und bei den 5 % der Fälle nehme ich die Performance-Einbußen gerne hin.

Danke Dir nochmal.
LG
Michi
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.