2016-07-24 8 views
0

私はこれらの未知数と方程式:u1、u2、... u10とeq1、eq2、... eq10を持っています。 現在、vpasolveを使用してそれらを解決しています 通常は計算する価値がありますが、その値が非常に低く(< 0.0001)、vpasolveが残りを解決した後(約10分)間違っていた、または未知数を排除しないようにしました。すべての10個の未知数のためのようにmatlab make IF関数内でのソートの決定

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

...と:

したがって、このような何かを意味します。 vpasolveには、未知数および方程式が書き込まれているかどうかを決定する同様の方法があります。 これは削除がOKであることを確認する必要がある場所です。そして、これは< 0.0001決定が行われる場所である。

if u1<0.0001 
verif(1)=1; 

私の問題は、私が正しく最初のコードを書く方法を知らないということですが(100、未知数のために、より簡単のようなものをどのように行うのかforループ)。

EDIT 1 これはすべてforループ内にあります。ための方法MathWorks社のMATLABの作品のいくつかのものはできません(または避けるべきである)ことを私はJava開発者に話されていると、彼は私に説明

EDIT 2

結論は、式vpasolveが別の場所で必要であり、その中にifが必要であるということを準備しなければならないということでした。

私は見ることができない、他の何かが間違っているのであれば、これはそれが今どのように見えるかで、(私は化学者だ)と言ってください。

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 

そして苦しむ私の他の質問についての質問同じ問題です...私はそれらを削除するか、ここにリンクを張るべきですか?

答えて

0

だから物事を再配置した後、それは次のようになります。

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]) 

func5 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; 

、彼らは行われませんが、質問の主な問題(およびその他の過去の質問は)

、メインプログラムを解決している

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