Verfasst am: 10.01.2012, 11:09
Titel: Viele Gleichungen mittels Solve lösen
Hallo,
ich habe viele unterschiedliche Gleichung die ich mittels solve lösen möchte. Bis jetzt habe ich eine Schleife, die jede Gleichung einzeln mit solve löst. Das dauert nur ziemlich lange (ca. 300.000 Gleichungen). Alternativ habe ich einen Vektor zur Verfügung, der alle Gleichungen enthält. Jetzt würde ich diesen gerne komplett an solve übergeben, um alle Gleichungen parallel zu lösen. Leider "denkt" Matlab nun, dass es sich um ein Gleichungssystem mit n Gleichungen und 1 Unbekannten handelt. Nur möchte ich die Gleichungen ja unabhängig von einander lösen. Gibt es da eine Möglichkeit?
ich hatte das selbe Problem und die Antwort ist ein klares Jein.
Matlab kennt die Solver nur mit EINER Variablen die aber MEHRERE Dimensionen haben kann. Du musst also alle deine Variablen in einen Vektor schreiben. Das sieht dann ungefähr so aus:
Code:
f_y = @(t,y)[ f1(y); f2(y);...];
y = [x1;x2...]
sol = ode45(f_y,tspan,y_0);
Hey,
schonmal danke für die antworten. ich poste mal meinen Quelltext:
1. Idee (funktioniert, dauert sehr lange):
for i=1:length(Data(:,2))
term = (Data(i,2)*log(90/x))^2)-x; %Funktion i die gelöst werden soll
z0=solve(term, x);
% Ausgabe des Bearbeitungsschrittes
fprintf('%i / %i \n',i, length(Data(:,2)));
end
2. Idee (funktioniert nicht):
term= ((1/log(90/x))^2).*Data_cut(1:1000,2)^2)-x; %Vektor aller Gleichungen mit jeweils der selben Unbekannten x
%Vordefinition des Lösungsvektors
z0=zeros(1,length(Data(:,2)));
%Lösung (führt zu einem Fehler von matlab)
z0=solve(term);
3. Lösungsidee:
% Erstellen eines Unbekannten-Vektor x=(x1;x2;x3 ...) -> dauert sehr lange (verbeserung der Laufzeit gegenüber 1. fraglich)
for i=1:length(Data_cut(:,2))
a=['syms x' num2str(i)];
eval(a);
a=['x(' num2str(i) ',1)=x' num2str(i)];
eval(a);
end
%Vektor aller Gleichungen mit jeweils dem Unbekannten-Vektor x
term= ((1/log(90/x))^2).*Data_cut(1:1000,2)^2)-x;
%Vordefinition des Lösungsvektors
z0=zeros(1,length(Data(:,2)));
%Lösung (führt auch zu einem Fehler von matlab )
z0=solve(term);
ps:
Mir fällt zu 1. noch auf, dass das Lösen der Gleichungen im Laufe der Zeit immer Langsamer wird. Zu Beginn (i<1000) lief es noch schnell (5 Lösungen /s). Nun bei i=100.000 nur noch etwa 1,5 Gleichungen/s. Hat jemand eine Idee wieso das so ist?
ich nehme an, dass x eine symbolische Variable ist und Data eine Double-Matrix.
Die Ergebnisse werden dann ohnehin nur numerisch; es ist also deutlich effizienter, direkt mit dem numerischen Löser FSOLVE zu arbeiten.
Code:
z1 = zeros(1,20);
opts = optimset('Display', 'off');
for i=1:length(Data(:,2))
term = @(x)(Data(i,2)*log(90/x))^2-x; %Funktion i die gelöst werden soll
z1(i)=fsolve(term, 1, opts);
% Ausgabe des Bearbeitungsschrittes fprintf('%i / %i \n',i, length(Data(:,2)));
end
Eine schönere Variante für die Fortschrittsanzeige wäre WAITBAR. Achtung, das Aktualisieren der Fortschrittsanzeige kann länger dauern als die eigentliche Berechnung, sollte also ggf. nicht in jeder Iteration durchgeführt werden.
% for i=1:length(Data_cut(:,2)) for i=1:100
term=(alpha/g*(Data_cut(i,2)*k/log(90/x))^2)-x;
z0=fsolve(term, 0.001, opts);
% Speichere das Ergebnis in einem Ausgabearray
Data_cut(i,7)=z0;
% Weitere Berechnungen folgen
Sigma=(Data_cut(i,2)/log(90/z0)+1.28*1.44*I15);
Data_cut(i,8)=Sigma;
fprintf('Bearbeitungsschritt: %i / %i \n',i, length(Data_cut(:,2)));
end
2. Man könnte die 2. Spalte zunächst sortieren (wenn sie recht zufällig angeordnet sind; wenn die Daten einigermaßen kontinuierliche Verläufe enthalten, ist das nicht nötig), und dann immer die vorherige Lösung als Startwert für die nächste Iteration nehmen. Dann sollte das deutlich schneller gehen. Natürlich muss man dann ggf. die Daten auch wieder "zurücksortieren".
Durch die besseren Startwerte sollte es deutlich schneller gehen.
Grüße,
Harald
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.