2016-06-13 18 views
0

Ich arbeite an Code in Matlab, die Grafiklösungen zu einem System von Gleichungen beinhaltet. Im Moment ist der einzige Weg, wie ich es mache, wie folgt:Matlab lösen das Gleichungssystem mit Fore-Loops schneller

E = 200000; v = .3;  
S = [1/E, -v/E, -v/E; 
-v/E, 1/E, -v/E; 
-v/E, -v/E, 1/E]; 
e1 = linspace(0,eu,52); 
sig10 = zeros(size(e1)); 
syms e2; syms e3; syms sig1; 

a = 0; 
for k = 1:52 
    sig = (S^-1)*[e1(k); e2; e3]; 
    eq1 = sig(3,1) == 0; 
    eq2 = sig(2,1) == a*sig1; 
    eq3 = sig(1,1) == sig1; 
    [solsig, sol2, sol3] = solve([eq1, eq2, eq3], [sig1, e2, e3]); 
    sig10(1,k) = solsig; 
end 

Es gibt mehrere andere Schleifen wie diese. Es funktioniert, aber es dauert ewig, es auszuführen. Ich habe versucht, das System außerhalb der Schleife symbolisch zu lösen, aber ich kann nicht herausfinden, wie ich in die Variable k einfügen soll, wo sie benötigt wird. Auch, weil ich es realisieren könnte eine einfache Möglichkeit, um dies zu realisieren, da es sich um eine Matrix Problem, hier ist ein weiterer Code, der mir ähnliche Fragen hat zu geben:

syms tous; syms sigs1; syms sigs2; 
sigxhill = zeros(1,361); 

for t=0:360 
    alpha = t; 
    eq1 = sigsx == sig1*cosd(alpha)^2+sigs2*sind(alpha)^2; 
    eq2 = 0 == sig1*sind(alpha)^2+sigs2*cosd(alpha)^2; 
    eq3 = tous == (sig1 - sigs2)*sind(alpha)*cosd(alpha); 
    eq4 = 2*sig0^2 == F*sigys^2+G*sigsx^2+H*(sigsx-sigsy)^2+2*N*tous^2; 
    sol1 = solve([eq1, eq2, eq3, eq4], [sigsx, tous, sigs1, sigs2]); 
    sigxhill(1,t+1) = sol1.sigsx(1); touhill(1,t+1) = sol1.tous(1); 
    sig1hill(1,t+1) = sol1.sigs1(1); sig2hill(1,t+1) = sol1.sigs2(1); 
end 

Hat jemand irgendwelche Ideen?

+0

Warum ohnehin in symbolischen Modus sind Sie? Wenn Sie darauf bestehen, die symbolische Notation zu haben, warum würden Sie dann eine Schleife verwenden? – Bernhard

+0

Sie können Parfor verwenden, wenn Sie die Parallelisierungs-Toolbox haben – Trogdor

Antwort

1

Leider kann ich Ihren Code nicht ausführen, weil ich die Symbolic Math Toolbox nicht installiert habe. Aber in thoses Fällen eine gute Möglichkeit, die MATLAB Profiler zu starten verwendet:

profile on; 
E = 200000; v = .3;  
S = [1/E, -v/E, -v/E; 
-v/E, 1/E, -v/E; 
-v/E, -v/E, 1/E]; 
e1 = linspace(0,eu,52); 
sig10 = zeros(size(e1)); 
syms e2; syms e3; syms sig1; 

a = 0; 
for k = 1:52 
    sig = (S^-1)*[e1(k); e2; e3]; 
    eq1 = sig(3,1) == 0; 
    eq2 = sig(2,1) == a*sig1; 
    eq3 = sig(1,1) == sig1; 
    [solsig, sol2, sol3] = solve([eq1, eq2, eq3], [sig1, e2, e3]); 
    sig10(1,k) = solsig; 
end 
profile viewer; 

Dies sollte Ihnen einige zusätzliche Informationen über die Teile des Codes, die den größten Teil der Ausführungszeit benötigen.

Siehe auch die Dokumentation für einige weitere Informationen:

http://de.mathworks.com/help/matlab/ref/profile.html

Verwandte Themen