MATLAB: Comment utiliser fsolve avec une entrée de tableau

J’ai modélisé les trois équations ci-dessous sur MATLAB en utilisant la fonction fsolve où N est égal à deux. Le code associé au problème est également ci-dessous. Les équations analysent les propriétés de deux composants, à savoir MB et C. Il y a deux types d’entrées, scalaires et matricielles et il y a deux problèmes auxquels je suis confronté.
Le premier problème concerne le nombre de solutions que je reçois. Je m’attends à recevoir quatre résultats qui seraient représentés par quatre colonnes dans la « Solution », cependant, je n’en reçois que trois. J’ai d’abord supposé que parce que j’avais trois équations, fsolve ne me fournirait que trois solutions, cependant, en supprimant l’une des équations,cela n’a fait aucune différence pour le résultat final.Les trois solutions que je reçois sont satisfaisantes mais j’ai juste besoin de la quatrième (colonne) maintenant! Il y a d’autres commentaires dans le code pour clarifier.
Le deuxième problème (moins important) concerne l’écriture de la fonction somme. J’essaie d’utiliser Fsolve pour une équation de sommation, cependant, je n’ai aucune idée de la façon de formuler cela. Pour le moment, j’ai simplement eu recours à un ajout car je n’ai que deux composants. Comment pourrais-je procéder?
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k_MB = 22.213; n_MB = 0.198;
k_C = 35.975; n_C = 0.234;
%%%%%%%%%%%%%%%%%%%%%%% ARRAY INPUTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%
AC = [3.983 6.558 7.683 5.817]; V = [0.029 0.030 0.032 0.030];
Ce_MB = [0.330 0.230 0.188 0.262]; Ce_C = [0.272 0.180 0.141 0.207];
qT = [1.386 0.919 0.868 1.024];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
options=optimset('MaxFunEvals',100000e+30,'MaxIter',100000e+30,'TolFun',.00001);
F = @(x) [(1 - ((((x(3)./((((x(1).*n_MB)./k_MB).^(1/n_MB)) + (x(2).*AC)))))+((x(4)./((((x(1).*n_C)./k_C).^(1/n_C)) + (x(2).*AC))))));...
(x(1)./x(2)) - (((((x(3)./(((((x(1).*n_MB)./k_MB).^(1/n_MB)) + (x(2).*AC)))*(1/n_C))))+((x(4)./(((((x(1).*n_C)./k_C).^(1/n_C)) + (x(2).*AC))).*(1/n_C)))));...
((((x(2) - qT)./qT)+((x(3)-Ce_MB)./Ce_MB)).^2)+ ((((x(2) - qT)./qT)+((x(4)-Ce_C)./Ce_C)).^2)];
% from Function F I hope to derive x(1), x(2), x(3) and x(4), however, at the moment it only provides x(1), x(2) and x(4).
%%%%%%%%%%%%%% SOLUTIONS %%%%%%%%%%%%%%%%%%%%
X0 = [Ce_MB;qT;Ce_C]'; % Initial guess, it won't let me do four initial guesses.
Solution = fsolve(F,X0)
Spreading_Pressure = Solution(:,1);
qT_Calculated = Solution(:,2);
C_MB = Solution(:,3)
C_C = Solution(:,4); % The function will not provide this as the Solution only has three columns.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 

Meilleure réponse

  • Voici ma tentative sans succès. Aucune solution trouvée. Y a-t-il une erreur que j’ai commise?
     

    function main
    opt = optimset('display','on');
    [res_MB,fMB] = fsolve(@(x)func(x,1),ones(1,3),opt);
    [res_C,fC] = fsolve(@(x)func(x,2),ones(1,3),opt);
    [res_MB(:) fMB(:)]
    function res = func(x,ind)
    Ce_MB = [0.330 0.230 0.188 0.262];
    Ce_C = [0.272 0.180 0.141 0.207];
    k_MB = 22.213;
    k_C = 35.975;
    n_MB = 0.198;
    n_C = 0.234;
    if ind == 1
    cMj = Ce_MB;
    Ki = k_MB;
    ni = n_MB;
    else
    cMj = Ce_C;
    Ki = k_C;
    ni = n_C;
    end
    qMj = [1.386 0.919 0.868 1.024];
    mj = [3.983 6.558 7.683 5.817];
    Lj = 0.02;
    %%%%%%%% UNKNOWN %%%%%%%%%%%%%%%%%%
    % cRj = CR_MB and CR_C % Just to iterate this is two separate arrays.
    % phi
    % qRj
    phi = x(1);
    qRj = x(2);
    cRj = x(3);
    c0i = x(3);
    ftmp1 = (phi.*ni./Ki).^(1/ni) + qRj*mj./Lj;
    f1 = 1 - sum(c0i./ftmp1);
    f2 = phi/qRj - sum(c0i./ftmp1./ni);
    ftmp2 = abs((qRj-qMj)./qMj) + abs((cRj-cMj)./cMj);
    f3 = sum( ftmp2.^2 );
    res = [f1 f2 f3];