【问题标题】:matlab make IF decide writing someting inside a functionmatlab让IF决定在函数内部写一些东西
【发布时间】:2016-07-24 16:06:51
【问题描述】:

我有这些未知数和方程:u1,u2,...u10 和 eq1,eq2,...eq10。 我目前正在使用 vpasolve 解决它们 通常它们值得计算,但有时它们的值非常低(

所以这意味着:

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

... 每 10 个未知数以此类推。 vpasolve 将有类似的方式来确定是否编写了未知数和方程。 这是我应该检查它是否可以移除的地方。这就是做出

if u1<0.0001
verif(1)=1;

我的问题是我不知道如何正确编写第一个代码以及如何更轻松地处理 100 个未知数(类似于 for 循环)。

编辑 1 这一切都在一个 for 循环中。

编辑 2

我与一位 Java 开发人员交谈过,他向我解释说,由于 matlab 的工作方式,有些事情是不可能的(或应该避免的)。

结论是我应该在其他地方准备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

还有一个关于我遇到相同问题的其他问题的问题...我应该删除它们,还是在此处放置链接?

【问题讨论】:

    标签: matlab loops if-statement for-loop


    【解决方案1】:

    所以在重新排列之后它看起来像这样:

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

    函数5 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 2013-07-18
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多