Двухфазный симплекс-метод с Matlab - PullRequest
0 голосов
/ 05 июня 2019

У меня проблема с моим кодом MATLAB, который решает линейные уравнения двухфазным симплексным методом. В некоторых примерах это не работает, и я не могу найти, в чем проблема.

Рабочий пример и нерабочие примеры приведены на рисунке ниже:

enter image description here


Код ниже

 clear
    clc
    close all

        %%
        %these are working examples
        %%
        %Number1
        %a=[-1 3 1 0 0 0 0;1 1 0 1 0 0 0;1 -1 0 0 1 0 0;1 3 0 0 0 -1 1]; 
        %f=[-1 -2 0 0 0 0 0];
        %f1=[-1 -3 0 0 0 1 0];
        %b=[10;6;2;6;0;-6];
        %Number 2
        %a=[5 8 1 0 0;5 2 0 -1 1]; 
        %f=[-1 2 0 0 0];
        %f1=[-5 -2 0 1 0];
        %b=[50;20;-20;0];
        %%
        %This is the one that don't give me any answer
        %%
        %a=[-1 1 1 -1 1 0 0;3 1 -1 0 0 -1 1]; 
        %f=[10 6 2 0 0 0 0];
        %f1=[-3 -1 1 0 0 1 0];
        %b=[1;2;0;-2];
        %%
        %Code

        c=[[a;f;f1],b];
        [e,d]=size(c);
          while f1(end)==0
                g=find(min(f)==f);
                g=g(1,1);
                h=c(:,g);
                for i=1:length(h)
                    if h(i)>0
                        l(i)=b(i)./h(i);
                    else
                        l(i)=inf;
                    end
                end
                    l(end)=inf;
                    l(end-1)=inf;
                    m=min(l);
                    n=find(l==m);
                    n=n(1,1);
                    c(n,:)=c(n,:)./c(n,g);
                     for j=1:e
                if j~=n
                    c(j,:)=c(j,:)-c(n,:).*c(j,g);
                end
                     end
                a=c(1:end-2,1:end-1);b=c(:,end);f=c(end-1,1:end-1);f1=c(end,1:end-1);

          end

          c(end,:)=[];

        while min(f)<0
            [p,q]=size(c);
            g1=find(min(f)==f);
            g1=g1(1,1);
            h1=c(:,g1);
            for i=1:length(h1)
                if h1(i)>0
                    l1(i)=b(i)./h1(i);
                else
                    l1(i)=inf;
                end

            end
            l1(end)=inf;
            m1=min(l1);
            n1=find(l1==m1);
            n1=n1(1,1);
            c(n1,:)=c(n1,:)./c(n1,g1);
            for j=1:p
                if j~=n1
                    c(j,:)=c(j,:)-c(n1,:).*c(j,g1);
                end
            end
            a=c(1:end-1,1:end-1);b=c(:,end);f=c(end,1:end-1);
        end
        Minf=-c(end,end)

Если вы попытаетесь решить их, вы увидите, что код не имеет ответа, и я хочу знать, что именно должно измениться, чтобы работать.

...