2016-07-24 9 views
0

Ich habe diese Unbekannten und Gleichungen: u1, u2, ... u10 und eq1, eq2, ... eq10. Ich löse sie derzeit mit vpasolve Normalerweise sind sie es wert zu berechnen, aber manchmal sind ihre Werte so niedrig (< 0.0001), dass ich sie beseitigen möchte, und nachdem vpasolve den Rest löst (etwa 10 Minuten) sollte ich überprüfen, ob es war falsch oder nicht die Unbekannten zu beseitigen.Matlab machen IF zu entscheiden schreiben etwas in einer Funktion

So würde dies bedeuten, so etwas wie:

verif=zeros(10); %false value for removing unknowns 
syms if verif(1)=0 
write 'u1' 
end 

... und so weiter für alle 10 Unbekannten. vpasolve hätte eine ähnliche Art zu entscheiden, ob die Unbekannten und Gleichungen geschrieben werden. Dies ist der Ort, an dem ich überprüfen sollte, ob das Entfernen OK war. Und dies ist der Ort, an dem die < 0,0001 Entscheidung getroffen wird:

if u1<0.0001 
verif(1)=1; 

Mein Problem ist, dass ich nicht weiß, wie man richtig den ersten Code zu schreiben, und wie es tun leichter für 100 Unbekannten (so etwas wie ein für Schleife).

EDIT 1 Dies ist alles innerhalb einer for-Schleife.

EDIT 2

Ich habe einen Java-Entwickler gesprochen, und er erklärte mir, dass einige Dinge nicht möglich sind (oder zu vermeiden) wegen der Art und Weise Matlab funktioniert.

Die Schlussfolgerung war, dass ich die Gleichungen vpasolve muss woanders, nicht mit einem if innerhalb es vorbereiten.

So ist dies, wie es jetzt aussieht, bitte sagen, ob es etwas anderes falsch ist, dass ich nicht (ich bin nur ein Chemiker) sehen:

verif=zeros(10); %false value for removing unknowns 
eq=[eq1,eq2...eq10]; %original eq's 
eq(2,:)=eq(1,:); %eq's I can modify 
for loop 
syms u1 u2...u10; 
[u1,u2...u10]=vpasolve(eq(2,:),[u1,u2...u10]; 
%this is where the verification of my assumption should take place 
%to note that u1...u4 are not to be judged this way 
if verif(5)=1 
%the verification I need 
if %verification returns that the assumption was wrong-this normally does not happen 
eq(2,5)=eq(1,5); 
verif(5)=0; %wait a few loops before making that assumption again 
run the for loop again 
end 
end 
... 
if u5<0,0001 
eq(2,5)=(u5==0); 
verif(5)=1; 
end 
... 
end for 

Und eine Frage über meine andere Fragen, die leiden das gleiche Problem ... sollte ich sie löschen oder einen Link zu hier setzen?

Antwort

0

So, nachdem die Dinge neu anordnen sieht es wie folgt aus:

init5

om(1)=2.76;   %conc acid baie 
om(2)=27.5/56;  %conc Fe2 baie 
om(3)=23.5/56;  %conc Fe3 baie 
om(4)=1;    %conc baza biureta 
om(5)=5/1000;   %volum acid luat in pahar 
om(6)=50/1000;  %volumul la care se aduce solutia din pahar 
om(7)=1/1000;   %volumul de baza adaugat pt iteratie- va disparea cand se va autorecalcula sau va deveni v initial si va varia 

digits(6) 
vb0max=uint8((om(1)+om(3))*10);    %volum baza pt titrare  acid (fara Fe)-se va sterge pt ca se va face altfel 
cct(1)=om(1)*om(5)/om(6);     %conc constanta 1 -  acid dupa dilutie 

%1-H^+ 2-Fe^2+ 3-Fe^3+ 4-SO4^2- 5-HSO4^- 6-FeHSO4^+ 7-FeSO4 8-FeHSO4^2+ 9-FeSO4^+ 10-Fe(SO4)2^- 11-FeOH^2+ 12-Fe(OH)2^+ 13-Fe(OH)3???0 14-OH^- 15-Na+ 
c=zeros(15,vb0max); 
ct=zeros(4,vb0max);  %matricea conc totale in timp real 4-OH 
v=zeros(4,vb0max);  %matricea volume in timp real 1-vt 2-vb 3-v1 4-v3 

%concentratii totale 
v(1,1)=om(6); 
ct(1,1)=2*cct(1); 
ct(2,1)=om(2)*om(5)/v(1,1); 
ct(3,1)=om(3)*om(5)/v(1,1); 
cct(4)=(cct(1)+ct(2,1)+3/2*ct(3,1))*om(6); 

t = animatedline; 
axis([0,vb0max+1,0,7]) 

Fkt5 r = sym ('r', [1 12]);

eq=[ct(1,j)-r(5)-r(6)-r(8)  , 0, 0.5, 0, 0; 
ct(2,j)-r(6)-r(7)   , NaN, NaN, 0, 0; 
ct(3,j)-r(8)-r(9)-r(10)-r(11)-r(12) , NaN, NaN, 0, 0; 
cct(4)/v(1,j)-r(5)-r(6)-r(7)-r(8)-r(9)-2*r(10), NaN, NaN, 0, 0; 
r(4)*r(1)*10^1.98   , NaN, NaN, 0, 0; 
r(4)*r(1)*r(2)*10^1.08  , NaN, NaN, 0, 0; 
r(4)*r(2)*10^2.25   , NaN, NaN, 0, 0; 
r(4)*r(1)*r(3)*10^2.48  , NaN, NaN, 0, 0; 
r(4)*r(3)*10^4.04   , NaN, NaN, 0, 0; 
r(4)^2*r(3)*10^5.38   , NaN, NaN, 0, 0; 
1.9*10^(-3)*r(3)/r(1)  , NaN, NaN, 0, 0; 
2.5*10^(-3)*r(3)/r(1)^2  , NaN, NaN, 0, 0]; 
eq(:,6)=eq(:,1); 

r = vpasolve(r==transpose(eq(:,6)), r,eq(:,2:3)); 

%verify 
for i=5:12 
if isequal(eq(i,4),1) 
if eq(i,6)>0.0001 
eq(i,4)=0; 
eq(i,6)=eq(i,1); 
%redo vpasolve 
end 
end 
end 

%for i=5:12 
%if r1<0,00001 
%eq(i,6)=0 
%eq(i,4)=1 
%if r1<0 
%end 
%end 

c(1,j)=r.r1;c(2,j)=r.r2;c(3,j)=r.r3;c(4,j)=r.r4;c(5,j)=r.r5;c(6,j)=r.r6;c(7,j)=r.r7;c(8,j)=r.r8;c(9,j)=r.r9;c(10,j)=r.r10;c(11,j)=r.r11;c(12,j)=r.r12; 

traurig über kommentierten Zeilen, werden sie nicht getan, aber Hauptproblem der Frage (und andere Fragen Vergangenheit) wird

und Hauptprogramm gelöst

init5 
for j=1:vb0max 
func5 
v(1,j+1)=v(1,j)+om(7); %v total 
v(2,j+1)=v(2,j)+om(7); %vb 
ct(1,j+1)=(ct(1,j)*v(1,j)-om(4)*om(7))/v(1,j+1); 
ct(3,j+1)=ct(3,j)*v(1,j)/v(1,j+1); 
ct(2,j+1)=ct(2,j)*v(1,j)/v(1,j+1); 
ct(4,j)=10^(-14)/ct(1,j); %OH t 
pH(j)=-log10(ct(1,j));addpoints(t,v(2,j)*1000,pH(j));drawnow 
pause(0.05) 
end