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

quadratische Gleichung lösen und reelle Werte speichern

 

Moses84
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 15:44     Titel: quadratische Gleichung lösen und reelle Werte speichern
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine m-file, in der eine Vielzahl von quadratischen Gleichungen gelöst werden sollen. Mit den positiven Ergebnissen möchte ich in der gleichen m-file weiter arbeiten.

Es handelt sich immer um die gleiche Formel die gelöst werden muss. Sie hat die Form:
Code:

wp1*vs^2+(wp2-1)*vs+J=0
%wp1 und wp2 sind Konstanten
%vs ist das gesuchte Ergebnis und liegt im Bereich von ca. 0...30
%J ist ein Vektor mit etwa 50 Einträgen
 


Für einen bestimmten Vektoreintrag z.B. j(end)=0.83*94/60*5.8 erhalte ich mit
Code:

wp1 = -0.00038235;
wp2 = 0.19205;
syms 'vs'
eq=wp1*vs^2+(wp2-1)*vs+0.83*94/60*5.8;
n=4;
vpa(solve(eq,vs),n)
 

die zwei richtigen Lösungen, wobei mich die negative nicht interessiert.

Habt ihr eine Idee für mich, wie ich das umsetzen kann?
Hab erst vor ein paar Tagen angefangen mit Matlab zu arbeiten, darum bitte nicht zu knapp erklären...
Danke, Moses
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.05.2012, 15:57     Titel:
  Antworten mit Zitat      
Hallo,

wenn du eine Vielzahl von solchen Gleichungen hast, solltest du mit ROOTS arbeiten statt das ganze halb-symbolisch zu lösen.

Code:
loesungen = roots([wp1, wp2-1, J]);
loesungen = loesungen(real(loesungen)>0 & imag(loesungen) == 0);


Die zweite Zeile kann wohl durch
Code:
loesungen = loesungen > 0;

ersetzt werden, aber ich möchte nicht garantieren, dass da im komplexwertigen Fall das richtige herauskommt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 16:52     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für deine rasche Antwort.

Folgendes hab ich ausprobiert, wobei ich meine Konstanten wegen der ersten aufgetretenen Fehlermeldung in Vektoren umgeschrieben habe:

Code:

clear all;
clc;
%% Berechne v_S für VPP
je=[0:0.1:1]';
[m,n]=size(je);
m; %Anzahl der Zeilen
n; %Anzahl der Spalten
wp1 = -0.00038235;  %Konstanten
wp2 = 0.19205;      % ''

wp1eq=wp1*ones(m,n); %Vektorisiere Konstanten
wp2eq=wp1*ones(m,n); % ''
syms 'vs'
eq=wp1eq.*vs.^2+(wp2eq-1).*vs+je;
loesungen = roots([wp1eq, wp2eq-1, je]);
loesungen = loesungen(real(loesungen)>0 & imag(loesungen) == 0)
%loesungen = loesungen > 0;
 


Jetzt kommt folgende Fehlermeldung:
Code:

Error using roots (line 24)
Input must be a vector.

Error in test (line 17)
loesungen = roots([wp1eq, wp2eq, je]);
 


Die Variablen wp1eq, wp2eq und je haben alle die gleiche Dimension, das wurde bei der ersten Fehlermeldung 'kritisiert'. Stimmt jetzt irgendwas an der Syntax nicht? In line 24 steht bei mir nix.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

roots kannst du nur auf eine Gleichung anwenden, da müsste also eine Schleife über die Gleichungen kommen.

Wenn du eine Schleife vermeiden möchtest, könntest du versuchen, das einmal symbolisch zu lösen und dann mit matlabFunction ein Function Handle daraus erzeugen, und dann deinen Vektor vs einsetzen.
Oder natürlich die quadratische Formel verwenden und das manuell herleiten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2012, 17:34     Titel:
  Antworten mit Zitat      
Auf diesem Weg komme ich zum Ziel.
Aber gibt es auch eine elegantere Lösung? Denn jetzt lege ich eine Datei an und schreibe meine Nullstellen für jeden Schleifendurchlauf zeilenweise ein, nur um sie im folgenden Schritt wieder auszulesen und mir den gewünschten Vektor anzeigen zulassen.
Meine Matlab Kenntnisse sind recht jung und Verbesserugsvorschläge sind mir willkommen - wie schreibe ich die positiven Nullstellen direkt in den Vektor v_S_iter?

Nochmals danke für den Hinweis auf die Funktion root und allen Interessierten einen schönen Samstag Abend.
Moses.

Code:

clear all;
clc;
%% Berechne v_S für VPP
je = [0:1:100]';    %Testvektor
[m,n] = size(je);
wp1 = -0.00038235;  %Konstanten
wp2 = 0.19205;      % ''

%Startwerte
k = 1;
while k<=m
    p = [wp1 (wp2-1) je(k)];
xk=roots([wp1 (wp2-1) je(k)]);
                % Schreibe Ausgabedatei mit den iterierten
                % geschwindigkeiten in eine Datei 1Spalte k1:end,
                % 2Spalte erste Nullstelle, 3Spalte zweite Nullstelle
                data_out_vs=[k xk'];                                  
                dlmwrite('iteration_vs.txt',data_out_vs,'-append');                          
 
k=k+1;
            if k>3000 %Abbruchbedingung
                'Fehler - Abbruchbedingung für Nullstellenfindung v_S=f(w) erfüllt'
                break
               
            elsif
           
            end
end
% Lese erzeugte Datei
data_vs_iteration=dlmread('iteration_vs.txt');
% Erstelle Vektor
v_S_iter = data_vs_iteration(1:end,3)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.05.2012, 18:01     Titel:
  Antworten mit Zitat      
Hallo,

warum schreibst du in eine Datei? Warum legst du das nicht in einer Variable welcher Art auch immer ab? Im Zweifelsfall in einem Cell Array...

Grüße,
Harald
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 - 2025 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.