Verfasst am: 16.10.2019, 22:23
Titel: Nullstellen der Besselfunktion mit Newton-Näherung
Liebes Forum
Ich sitze schon seit Tagen an einem Problem an dem ich einfach nicht weiter komme, und mir auch kein anderer Helfen kann.
Und zwar ich soll die die ersten 3 Nullstellen der Besselfunktion mit J = 0,1,2 bestimmen, und zwar mit der Newton-Näherung.
Hierbei habe ich ich die Besselfunktion nach Vorzeichenänderungen abgetastet um geeignete Startwerte zu finden, und wollte darauf hin die Näherung mit einer while Schleife realisieren mit gegebener Schranke 1e-13. Doch es funktioniert einfach nicht. Bin schon wirklich am verzweifeln. Daher meine Bitte, könnt ihr mir bitte Sagen was ich falsch mache?
Vielen Dank im Voraus für eure Hilfe!
Dein Gradient haut meiner Meinung nach nicht hin. Du legst in klein j0 nacheinander deine Nullstellenkandidaten ab und bildest dann davon den Gradienten.
Danke für die Antwort
Wie kann ich in Matlab die erste Ableitung der Besselfunktion sonst berechnen?
Leider kenne ich nur die Befehle gradient und diff, und mit beiden scheint es leider nicht hinzuhauen.
Gradient ist schon die korrekte Funktion, nur das Argument passt noch nicht. Ich würde dir zunächst empfehlen, erstmal nur die erste Nullstelle zu suchen, die restlichen kann man dann später sehr einfach hinzufügen.
Zu Beginn kannst du dir den Gradienten zunächst für den gesamten betrachteten Bereich zurechtbasteln: JD0 = gradient(J0)
Die Ableitung an deiner ersten Nullstelle nullstelle0 kannst du dir dann einfach über jd0=JD0(nullstelle0) aus diesem Vektor herausziehen. Damit solltest du dir erste Iteration deiner Lösung hinbekommen. Jetzt wirst du natürlich nicht drumherum kommen, an der so errechneten neuen Nullstele die Besselfunktion und deren Ableitung erneut auszuwerten.
Ok, Danke für die schnelle Hilfe !
Ich habe das ganze soeben ausprobiert aber leider, bekomme ich für die 1 Nullstelle nur 2.272 heraus, eigentlich sollte ja pi rauskommen für die 1 Nullstelle der Besselfunktion J = 0, oder? Aber zumindest läuft jetzt die Schleife
An was könnte das liegen? Für mich sieht der Code eigentlich so weit richtig aus.
Da ist noch einiges im Argen, angehängt ist ein funktionierender kommentierter Code für eine Nullstelle. Dein Abbruchkriterium ist im neuen Code falsch herum, er soll doch bitte rechnen bis der Fehler kleiner ist als dein Abbruchkriterium, nicht umgekehrt
Außerdem haut dein Gradient nach wie vor noch nicht hin. Du übergibts aktuell ein Skalar an gradient(), demenstprechend gibt dir gradient() nur eine Null zurück. Die gradient()-funktion braucht immer Vektoren und spuckt dir dann die Differenzen zwischen den Vektoreinträgen aus. Das kann man nutzen, um die Ableitung zu berechnen in dem man das Ergebnis durch die (x)-Schrittweite teilt.
Die Nullstelle kannst du einfach überprüfen, indem du die Funktion fix plottest
plot(x, J0), da siehst du auch, dass deine "berechnete" Nullstelle gar nicht so weit von der tatsächlichen Nullstelle entfernt liegt. Allerdings ist die ausgegebene Nullstelle bisher nur deine erste Schätzung, das Newtonverfahren kam nicht zur Anwendung da, wie bereits erwähnt, dein Abbruchkriterium noch nicht hinhaut.
Code:
x = linspace(0,15,10000); % x-Vektor für die erste Nullstellensuche aufbauen, je mehr Punkte desto genauer ist die Abschätzung!
sw = x(2)-x(1); % Schrittweite des x-Vektors, wichtig um die Ableitung korrekt zu bestimmen
J0 = besselj(0,x); % Besselfunktion
JD0 = gradient(J0)/sw; % Und deren Ableitung
%% Erste Nullstllensuche, war so korrekt
vorzeichen0 = sign(J0);
nullstelle0=find(diff(vorzeichen0)>0 | diff(vorzeichen0)<0);
nullstelle0=nullstelle0(1);
Buh,bei diesen Problem bin ich doch wirklich seit Tagen auf dem Schlauch gestanden!
Auf jeden Fall Danke für die Hilfe, jetzt hab ich es endlich verstanden
lg
Taiyou
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
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.