MATLAB语言实现单纯形法

本文详细介绍了使用MATLAB语言实现线性规划问题的单纯形法,包括算法原理、程序示例、具体输入步骤及最终求解结果的展示。通过实例解析,帮助读者理解并掌握如何运用MATLAB解决线性规划问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理在这里插入图片描述

在这里插入图片描述

程序

function [x,minf]= SimpleMthd(A,c,b,baseVector)
% 约束矩阵:A
% 目标函数系数向量∶ c; 
% 约束右端向量∶b; 
% 初始基向量∶baseVector
% 目标函数取最小值时的自变量值∶x;
% 目标函数的最小值∶ minf
sz = size(A); 
nVia =sz (2);
n=sz(1); 
xx=1:nVia;
nobase=zeros(1,1);
m=1;         
for i=1:nVia           %获取非基变量下标
     if  (isempty(find(baseVector==xx(i),1)))
              nobase (m)= i; 
              m=m+1; 
     else
         
     end
end
bCon = 1; 
M= 0; 


while bCon
   nB=A(:,nobase);           %非基变量矩阵
   ncb= c(nobase);            %非基变量系数
   B=A(:,baseVector);         %基变量矩阵
   cb=c(baseVector);          %基变量系数
   xb=inv(B)*b; 
   f=cb*xb; 
   w=cb*inv(B);
   for i=1:length(nobase)
       sigma(i) = w*nB(:,i) - ncb(i); 
   end
   [maxs,ind]= max(sigma);     %ind为进基变量下标
   if maxs <= 0                %最大值小于零,输出最优解 
        minf = cb*xb;
        vr=find(c~=0 ,1,'last'); 
        for l=1:vr
           ele=find(baseVector==l,1); 
           if (isempty(ele)) 
               x(l)=0; 
           else
               
               x(l)=xb(ele); 
           end
        end
        bCon=0; 
   else
         y=inv(B)*A(:,nobase(ind));
   if y <=0   %不存在最优解 
        disp('不存在最优解!'); 
        x= NaN; 
        minf = NaN; 
        return;
   else      %寻找出基变量 
         minb=inf; 
         chagB = 0;
   for j=1:length(y) 
       if y(j)>0
           bz = xb(j)/y(j); 
           if bz<minb
               minb = bz; 
               chagB = j; 
           end
       end
    end   %chagB为出基变量下标
    tmp = baseVector(chagB);%更新基矩阵和非基矩阵 
    baseVector(chagB)= nobase(ind);
    nobase (ind) = tmp; 
   end
   end
   M= M+1;
%迭代步数限制
if(M == 1000000)
disp('找不到最优解!');
x = NaN; 
minf = NaN; 
return; 
end
end

输入

A=[-1 2 1 0 0;2 3 0 1 0;1 -1 0 0 1];
c=[-4 -1 0 0 0];
b=[4; 12; 3];
baseVector=[3,4,5];
[x,minf]= SimpleMthd(A,c,b,baseVector)

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leetteel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值