Verfasst am: 25.02.2019, 12:14
Titel: numerisch Nullstellen bestimmen durch Interpolation
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.
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 ;)
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.
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
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 ;)
vielen Dank für deine Hilfe, es funktioniert wunderbar
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.
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 ;)
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.
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 ;)
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
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.