来自搜索
function [opt_X,opt_S]=Simplexe2(fhandle,X_0,n,lambda,mu,h,epsiro,K)
%:单纯形加速法(教学版)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 参考文献:
% 林明芳,张宝生等.汽车优化设计.吉林科学技术出版社,1991.P61-67
% Write By coldstar@126com 20059
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Input:
% -fhandle 函数句柄
% -X_0 n维初始列向量
% -n 维数
% -lambda 步长压缩系数!=05 (0 1)
% -mu 步长加大系数>1
% -h 单纯形边长
% -epsiro 精度
% -K 最大寻优次数
% Output:
% -opt_X 最优值点
% -opt_S 最优值
% Example:
% >>f3=inline('60-10x(1)-4x(2)+x(1)^2+x(2)^2-x(1)x(2)');
% >>Simplexe2(f3,[0;0],2,0618,2,2,0001,20)
% >>fminsearch(f3,[0;0])
SearchTime=1;
%:初始单纯形
X=repmat(X_0,1,n)+heye(n);
X=[X_0,X];
%:初始化S,单纯形各点处函数值
S=inf(1,n);
for i=1:n+1
S(i)=Getfval(fhandle,X(:,i));
end
%:初始化SH,SG,SL,(最差点,次差点,最好点)
[SH,SG,SL,iXH,iXG,iXL]=GetShgl(S);
%:单纯性搜索寻优
while abs(SH-SL)>=epsiroabs(SL) %按精度收敛
%:寻找反射线上最优点XS,SS
XR=GetXR(X,X(:,iXH));
SR=Getfval(fhandle,XR);
if SR>=SG%:步长压缩
XS=(1-lambda)X(:,iXH)+lambdaXR;
SS=Getfval(fhandle,XS);
if SS>=SG %:单纯形收缩
for i=1:n+1
X(:,i)=(X(:,iXL)+X(:,i))/2;
end
end
elseif ((1-mu)SH+muSR)<SL %:步长加大
XE=(1-mu)X(:,iXH)+muXR;
SE=Getfval(fhandle,XE);
if SE<SR
XS=XE; SS=SE;
else
XS=XR; SS=SR;
end
else
XS=XR; SS=SR;
end
%:以寻优点XS替代最坏点XH,构成新单纯形
X(:,iXH)=XS; S(iXH)=SS;
%:重置XH,XG,XL,
[SH,SG,SL,iXH,iXG,iXL]=GetShgl(S);
%:迭代计数
SearchTime=SearchTime+1;
if SearchTime>K break; end %超过最大次数
end
%:返回并显示寻优结果
opt_X=X(:,iXL);opt_S=SL;
fprintf(1,'单纯形法 经%d次搜索:\n',SearchTime);
disp('最优点为'); disp(opt_X);
disp('最优点处目标函数值为'); disp(opt_S);
%-------------------------------
function fval=Getfval(fhandle,X)
%:求多维函数值
fval=feval(fhandle,X');
%-------------------------------
function [SH,SG,SL,iXH,iXG,iXL]=GetShgl(S)
%:求目标函数最大值SH,次大值SG,最小值SL,及其X对应列的位置
[SH,iXH]=max(S);
[SL,iXL]=min(S);
S(:,iXH)=[];
[SG,iXG]=max(S);
if iXH<=iXG
iXG=iXG+1;
end
%-------------------------------
function XR=GetXR(X,XH)
%:计算反射点
n=length(XH);
XR=zeros(n,1);
for i=1:n+1
XR=XR+X(:,i);
end
XR=2(XR-XH)/n-XH;
迭代法 matlab实现代码如下
function [x,n] = jacobi(A,b,x0,eps,varargin)
if nargin ==3
eps = 10e-6;
M = 200;
elseif nargin<3
disp('输入参数数目不足3个');
return
elseif nargin ==5
M = varargin{1};
end
D = diag(diag(A)); %%求A的对角矩阵
L = -tril(A,-1); %%求A的下三角矩阵
U = -triu(A,1); %%求A的上三角矩阵
B = D\(L+U);
f = D\b;
x = Bx0+f;
n = 1;%迭代次数
while norm(x-x0)>=eps
x0 = x;
x = Bx0+f
n = n+1;
if(n>=M)
disp('Warning:迭代次数太多,可能不收敛!')
return;
end
end
运行效果如下:
扩展资料:
迭代法的收敛性判别
收敛性判别条件
SOR迭代法收敛的充分必要条件是ρ(λω)<1,ρ(λω)与松弛因子ω有关。ρ(λω)与ω的关系以及SOR方法收敛的条件有如下定理。
定理1:(Kahan)对任意的A
,设其对角元皆非零,则对所有实数ω,有:ρ(λω)≥ ω-1。
推论:如果解Ax=b的SOR方法收敛,则有ω-1<1,即0<ω<2。
定理2:(Ostrowski-Reich)设A
,A对称正定,且0<ω<2,则解Ax=b的SOR方法收敛。
参考资料来源:百度百科-逐次超松驰迭代法
求解线性规划问题,matlab里统一使用linprog函数,其用法是
x = linprog(f,A,b,Aeq,beq,lb,ub)
并且是用来求解最小值的,所以目标函数改为最小值。
这里参数
f=[-40;-30;-10]
A=[9 7 10;06 15 1;06 15 -1]
b = [10; 32; 5]
lb = zeros(3,1)
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
=======================
运行结果
x =
11111
00000
00000
1、下图是需要求解的线性方程组。
2、打开MATLAB,利用左除法(\)求解上述线性方程组。输入如下代码:close all; clear all; clc% MATLAB左除法(\)求解线性方程组,A = [1 2 3;-1 3 7;9 0 3];b = [1 4 7]';x = A\b。
3、保存和运行上述代码,利用左除法(\)得到线性方程组的解。
4、用求逆法(inv)求解线性方程组,输入如下代码:close all; clear all; clc,% MATLAB求逆法(inv)求解线性方程组,% A是线性方程组等号左边系数构成的矩阵。
5、保存和运行上述代码,利用求逆法(inv)得到线性方程组的解如下。
6、最后,可以看到左除法(\)和求逆法(inv)求得的线性方程组解是一样的。
function newton(x0,e,N)
%输入xo为估计的迭代初值,e为规定的误差,N为最大迭代次数
%输出x,y为最后迭代的两个近似根,k为迭代次数
clc
format long;
disp('迭代次数 近似根')
k=0;
x1=0;
x2=x0;
while (abs(x2-x1))>e
x1=x2;
x2=x1-f(x1)/df(x1);
k=k+1;
if k>N
return;
end
%%%%%%记录并输出%%%%%%%%%
o1=sprintf('%3d',k);
o2=sprintf('%38f',x2);
OL=[o1,' ' o2];
disp(OL);
y(k)=x2;
end
%%%%画图%%%%%%%
i=1:k;
figure(2)
plot(i,y,'rD-')
grid on
xlabel('迭代次数')
ylabel('近似根')
title(['牛顿法求出的该方程的近似根 x^=', num2str(x2,9)])
function y=f(x)
y=x^2/2-sin(x)-1;
function y=df(x)
y=x-cos(x);
以上就是关于急求运筹学单纯型法的matlab程序代码!!全部的内容,包括:急求运筹学单纯型法的matlab程序代码!!、SOR迭代法 求MATLAB程序、matlab单纯形法求解线性规划 用MATLAB 编个程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)