第六节-数值微分与方程求解
01-非线性方程组求解和最优化问题
% 第六节-数值微分与方程求解
% 01-非线性方程组求解和最优化问题
% 迭代法 二分法 割线法
% (1)【单变量】非线性方程求解
% 函数的调用格式为:
% x=fzero(filename,x0)
% 其中,filename是待求根方程左端的函数表达式,x0是初始值。
% eg 求 f(x)=x-1/x+5 在 x0=-5 和 x0=1 作为迭代初值时候的根
f=@(x)x-1./x+5;
x1=fzero(f,-5)
x2=fzero(f,1)
x3=fzero(f,0.1)
x=-5:0.1:5
y=f(x) %匿名函数的使用及调用形式
plot(x,y) %绘图
grid on %打开网格
% 求 x^2-1=0 的根
f1=@(x) x.^2-1
x=[];
x0=-0.25:0.001:0.25
for x00=x0
x=[x,fzero(f1,x00)];
end
figure(2)
plot(x0,x,'-o')
xlabel('初值')
ylabel('方程的根')
axis([-0.25,0.25,-1,1]) %搜索结果依赖于函数特性和指定的初值
% (2)非线性方程组的求解
% 函数的调用格式为:
% x=fsolve{filename,x0,option)
% 其中,x为返回的近似解,filename是待求根方程左端的函数表达式
% x0是初值,option用于设置优化工具箱的优化参数,可以调用optimset函数来完成。
x1=fsolve(f,-5,optimset('Display','off')) %返回x=-5的近似解
x2=fsolve(f,1,optimset('Display','off'))
% 求下列方程组在(1,1,1)附近的解,并对结果进行验证
% sinx +y+z^2 * e^x=0
% x+y+z=0
% xyz=0
f2=@(x)[sin(x1)+x(2)+x(3)^2*exp(x(1)), x(1)+x(2)+x(3),x(1)*x(2)*x(3)]
% 注:匿名函数共有3个函数,且有3个变量分别为x1,x2,x3.故
f2([1,1,1])
x2=fsolve(f2,[1,1,1],optimset('Display','off')) %求得在(1,1,1)处附近的解
f2(x2) %将求得的解带入方程中看下求出的结果和实际结果的差值(和0比较)
% 函数极值计算
% 极大值和极小值计算
% 在matlab中,只提供了求极小值计算方法
% 所以,我们要求f(x)极大值的时候,只需要求【-f(x)】的极小值的计算,这样就是求得f(x)得极大值
%求极小值分为两类 无约束最优化问题(在x[-∞,+∞]) 和 有约束最优化问题x[a,b]
%求最小值的函数
% [xmin ,fmin]=fminbnd(filename,x1,x2,option) %求【一元】函数在x1到x2开区间中的极小值【点】xmin,和最小值fmin
% [xmin ,fmin]=fminsearch(filename,x0,option) % 基于单纯性算法,求【多元】函数的极小值【点】xmin,和最小值fmin
% [xmin ,fmin]=fminunc(filename ,x0,option) % 基于拟牛顿法【求多元】函数的极小值【点】xmin,和最小值fmin
% 其中,filename是定义的目标函数。第一个函数的输入变量【x1、x2】
% 分别表示被研究区间的【左、右】边界。后两个函数的输入变量【x0是一个向l量】
% 表示极值点的初值。option 为优化参数,可以通过optimset函数来设置。
% eg 求 f(x)=x-1/x+5 在 x0=-5 和 x0=1 在区间(-10,-1)和(1,10)上的最小值点
f %定义的函数 在14行中已经定义好
[xmin,fmin]=fminbnd(f,-10,-1);
xmin % 打印 xmin 极小值【点】
fmin % 打印 fmin 最小值
[xmin,fmin]=fminbnd(f,1,10);
xmin % 打印 xmin 极小值【点】
fmin % 打印 fmin 最小值
% 2、有约束最优化计算问题
% f(x) 需要满足某种约束条件
% 线性不等式约束 线性等式约束 非线性不等式约束
% 非线性等式约束 x的上界和下界
% 有约束最优化问题
% 求有约束条件下最小值的函数为:
% [xmin,fmin]=fmincon(filename,x0,A,b,Aeq,beq,Lbnd,Ubnd,NonF,option)
% 其中,xmin、fmin、 filename、 x0和option的含 义与求最小值函数
% 相同。其余参数为约束条件,包括线性不等式约束、线性等式约束、
% x的下界和,上界以及定义非线性约束的函数。如果某个约束不存在,
% 则用空矩阵来表示。
% 求解有约束最优化问题
% f(x)=0.4*x2 +x1^2+x2^2-x1x2+1/30*x1^3 的极小值点 和最小值
% 约束条件 : x1+0.5x2 >=0.4
% 0.5x1+x2>=0.5
% x1>=0 ,x2>=0
f3=@(x)0.4*x(2)+x(1)^2+x(2)^2-x(1)*x(2)+1/30*x(1)^3
x3=[0.5,0.5];
A=[-1,-0.5;-0.5,-1]
b=[-0.4;-0.5]
lb=[0;0]
option=optimset('Display','off')
[xmin,fmin]=fmincon(f3,x3,A,b,[],[],lb,[],[],optimset('Display','off'))
% 在约束条件下求得极小值点 和最小值点
% (3)最小值问题应用实例
% 例5某公司有A、B、C、D、E5个工厂,分别位于xy平面.上的
% 坐标点(10, 10),(30, 50),( 16.667, 29) ,
% (0.555, 29.888)和(22.2221, 49.988)处。设两点之间的
% 距离表示在工厂2 间开车的距离, 以公里为单位。公司计划在
% 平面上某点处建造一-座仓库, 预期平均每周到A、B、 C、D、E
% 工厂分别有10、18、20、 14和25次送货。理想情况下,要使每.
% 周送货车的里程最小,仓库应建在xy平面的什么位置?
% 分析 :设仓库所选点的坐标为(x,y),则总里程表达式为:
% d=10((x-10)^2+(y-10)^2)^1/2 +18*((x-30)^2+(y-50)^2)^1/2
% +20((x-16.667)^2+(y-29)^2)^1/2 +14((x-0.555)^2+(y-29.888)^2)^1/2
% +25((x-22.2221)^2+(y-49.988)^2)^1/2
% 也就是说,求 d 在无约束条件下的最小值问题
a=[10,30,16.667,0.555,22.2221] % a 表示工厂的横坐标
b=[10,50,29,29.888,49.988] % b 表示工厂的纵坐标
c=[10,18,20,14,25] % c 表示每个工厂送货的次数
d=@(x)sum(c.*sqrt((x(1)-a).^2+(x(2)-b).^2)) %距离函数 d
[xmin,dmin]=fminsearch(d,[15,30]) %求解最小值,在区间【15,30】中,得到xmin 和 fmin
xmin % 打印 x,y 的极小值坐标点位置
dmin % 打印 d的最小值点
% 有约束条件下
% eg 由于地域条件的限制。仓库必须建在曲线 y=x^2 上,则应该建在何处
[xmin,fmin]=fmincon(d,[15,30],[],[],[],[],[],[],'funny')
% 注:这个需要再次了解和学习一下