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

numerisch Nullstellen bestimmen durch Interpolation

 

k123456
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 09.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2019, 13:14     Titel: numerisch Nullstellen bestimmen durch Interpolation
  Antworten mit Zitat      
Hi Leute,

ich interessiere mich dafür, wie man alles Nullstellen einer Gleichung in Matlab durch Interpolation bestimmen kan, wenn ich z.B. die Gleichung sin(B*x) *cos(x) = 0 mit B = 2 hernehme. Ich weiß bis jetzt, dass ich auf den Vorzeichenweseln achten muss. Aber wie drücke ich das ganze in Code aus. Hier fehlt mir die Idee.

Gruß
k123456
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: 25.02.2019, 21:01     Titel:
  Antworten mit Zitat      
Hallo,

1. Daten auf einem Gitter erstellen.
2. Wie von dir gesagt nach Vorzeichenwechseln suchen.
Code:
vzw = find( diff( sign(y) ) ~= 0 )

3. Wenn zwischen (x(k), y(k)) und (x(k+1),y(k+1)) ein Vorzeichenwechsel liegt:
Code:
xClose = interp1(y(k:k+1), x(k:k+1), 0)


Ja, normalerweise sind x und y in der anderen Reihenfolge. Da du aber zu einem y-Wert (0) den passenden x-Wert haben willst, sind die Rollen von x und y hier vertauscht.

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
 
k123456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 09.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2019, 15:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine schnelle Antwort. Bis jetzt habe ich folgendes:
Code:
clc; clear;

% Bestimmen aller positiven Wurzeln der transzendenten Gleichung
% sin(n*A)*cos(n) - sin(n).*sin(n*A) + sin(n).*cos(n*A) = 0

A = 0.5;
x = linspace(0,100,10001);
y = sin(x*A).*cos(x) - sin(x).*sin(x*A) + sin(x).*cos(x*A);
plot(x,y,[0,100], [0,0]);
vzw = find( diff( sign(y) ) ~= 0 )
 
 for k=1:100
 xclose = interp1(y(k:k+1), x(k:k+1), 0,'linear')
 end


Das kommt bei dem Befehl vzw heraus.

vzw =

1 158 379 usw

Ich interpretiere das so, als ob in dieser Spalte der vzw auftritt. Ansonsten sind alle anderen Werte NaN. Die müsste man doch dann rausfiltern können.

Am besten wäre am Ende ein Abbruchkriterium, wenn das hier mal läuft,
sodass ich mir nur die ersten 100 Wurzeln ausgeben lasse.

Gruß
k123456
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: 26.02.2019, 18:58     Titel:
  Antworten mit Zitat      
Hallo,

du machst die Interpolation unabhängig vom Vorzeichenwechsel - keine gute Idee. Besser:
Code:
xclose = zeros(size(vzw));
 for k=1:numel(vzw)
     start = vzw(k);
    xclose(k) = interp1(y(start:start+1), x(start:start+1), 0,'linear');
 end
 hold on
 yclose = sin(xclose*A).*cos(xclose) - sin(xclose).*sin(xclose*A) + sin(xclose).*cos(xclose*A);
 plot(xclose, yclose, 'x')
 hold off

Zitat:
Am besten wäre am Ende ein Abbruchkriterium, wenn das hier mal läuft,
sodass ich mir nur die ersten 100 Wurzeln ausgeben lasse.

Das wäre dann kein Problem. Hier gab es allerdings nur 48 Wurzeln. Du müsstest also das Gitter erweitern.

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
 
k123456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 09.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2019, 13:46     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Hilfe, es funktioniert wunderbar Smile

Diese Wurzeln dienen als Parameter für eine unendliche Summe, zusammengesetzt aus e-Funktionen, die ich z.B. nach 100 Termen abbrechen möchte (deswegen die 100 Wurzeln). Als Ergebnis der Summe soll ein Signal herauskommen, ähnlich einer Fehlerfunktion. Je nachdem wie ich die Schrittweite und das Intervall wähle, kommen die wildesten Kurven dabei heraus, aber nicht der gewünschte Verlauf meiner Funktion. Inwiefern lässt sich eine Aussage über die Festlegung der Intervalle bzw. der Schrittweiten treffen? Rumraten alleine bringts nicht.

Gruß
k123456
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.02.2019, 18:34     Titel:
  Antworten mit Zitat      
Hallo,

grobe Tipps:
die Schrittweite sollte man so wählen, dass zwischen zwei Datenpunkten max. 1 Wurzel liegt. Sollten mehrere darin liegen, wird nämlich nur eine gefunden. Das sicher zu vermeiden ist schwierig.
die Gesamtanzahl würde ich z.B. mal auf 1000 Schritte festlegen. Sollten innerhalb der 1000 Schritte 100 (oder mehr) Vorzeichenwechsel gefunden werden, bist du fertig. Ansonsten in einer while-Schleife weitere 1000 Schritte und dort nach Vorzeichenwechseln suchen, so lange bis genügend Vorzeichenwechsel gefunden wurden.

Ich weiß nicht, wie kompliziert die tatsächliche Funktion ist. Im vorliegenden Beispiel lassen sich die Nullstellen auch analytisch angeben: das Produkt ist 0, wenn einer der beiden Faktoren 0 ist.

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
 
k123456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 09.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2019, 14:37     Titel:
  Antworten mit Zitat      
Hallo Harald,

Wenn ich das Gitter auf 200 x-Werte erweitere und die 1000 Schritte, welche du vorgeschlagen hast, auf 1000 setze, dann bekomme ich 108 Nullstellen heraus, was mir schon mal reicht.

Die materialabhängigen Zahlen werden sich später immer wieder ändern, da das hier die theoretische Kurve für eine spätere Fitroutine werden soll. D.h., die Nullstellen bzw. die Wurzeln müssen immer wieder berechnet werden. Vielleicht könnte man dann hier einfach ein sehr viel größeres Intervall wählen, dass dann mit Sicherheit immer mehr als 100 Nullstellen berechnet, dann aber wie schon oben besprochen bei 100 gefundenen abbricht.

Die Endgleichung ist aber immernoch nicht die, die ich möchte.
Was ich sagen kann, dass ich das Intervall für die Nullstellen bei 0.0001 oder irgendetwas anderem kleinen beginnen lasse, da sonst die Endgleichung nicht definiert ist.

Vielleicht kann ich ja dir die finale Gleichung auch über eine PN zeigen.

Gruß
k123456
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: 01.03.2019, 15:52     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Endgleichung ist aber immernoch nicht die, die ich möchte.
Was ich sagen kann, dass ich das Intervall für die Nullstellen bei 0.0001 oder irgendetwas anderem kleinen beginnen lasse, da sonst die Endgleichung nicht definiert ist.

Was ist denn diese Endgleichung?

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
 
k123456
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 09.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2019, 09:30     Titel:
  Antworten mit Zitat      
Hallo,

es hat sich nun ergeben, dass die Formel mit einem kleinen Fehler behaftet war. Mit den Intervallen hat alles gestimmt und das Ergebnis ist das gewünschte.

Vielen Dank nochmal für die Hilfe!
k123456
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.