25.2 matlab里面的10中优化方法介绍——插值法(matlab程序)

1. 简述

插值法

插值法又称"内插法",是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值, 这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。常见分段线性插值法样条差值,样条插值误差更小。

1 线性插值法

线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。 假设我们已知坐标(x0,y0)与(x1,y1),要得到x0,x1区间内某一位置x在直线上的y值。根据图中所示,我们得到两点式直线方程:

假设方程两边的值为α,则:

则:y = y0 + α(y1 − y0)(即已知x就可得a值 然后再得y值。

实际上,即使x不在x0到x1之间并且α也不是介于0到1之间,这个公式也是成立的。在这种情况下,这种方法叫作线性外插---参见外插值

已知y求x的过程与以上过程相同。

2 样条插值法

常用三次样条插值法,具体概念比较复杂,可以自行百度。

3 拉格朗日差值法

略。

  • MATLAB中的使用-interp1函数:

MATLAB中的插值函数为interp1,其调用格式为: yi=interp1(x,y,xi,'method') 其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,
'method'表示采用的插值方法,MATLAB提供的插值方法有几种:
'nearest'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'pchip'立方插值.缺省时表示线性插值
注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。

2. 代码

主程序:

%% 用插值法求解最优化问题

clear all

f1202=inline('(x.*x - 2).^2/2-1', 'x');;

%%%设定区间端点

a = 0;

b = 5;

%%%分别设定x阈值和函数f阈值

TolX = 1e-5;

TolFun = 1e-8;

%%%设定迭代次数

MaxIter = 100;

%%%用二次插值函数求解

xoq,foq = Opt_Quadratic(f1202,a b,TolX,TolFun,MaxIter)

%用matlab内置函数求最小值以及它的函数值

xob,fob = fminbnd(f1202,a,b) %MATLAB 内置函数求解

子程序;

function xo,fo = Opt_Quadratic(f,x,TolX,TolFun,MaxIter)

% 用二次插值求f(x)最优解

if nargin < 5

MaxIter =100;

end

if nargin < 4

TolFun= 1e-8;

end

if nargin < 3

TolX = 1e-5;

end

%%%根据输入确定三点的初始值,并求出对应的函数值

if length(x) > 2

x012 = x(1:3);

else

if length(x) == 2

a = x(1);

b = x(2);

else

a = x-10; b = x+10;

end

x012 = a (a + b)/2 b;

end

f012 = f(x012);

%%%%初始化三点值

x0 = x012(1);

x1 = x012(2);

x2 = x012(3);

f0 = f012(1);

f1 = f012(2);

f2 = f012(3);

%%%%%求出插值二项式的取最小值处的x3以及相应的最小值f3

nd = f0-f2 f1-f0 f2-f1*x1\*x1 x2\*x2 x0\*x0; x1 x2 x0';

x3 = nd(1)/2/nd(2);

f3 = feval(f,x3);

%%%%判断是否停止迭代

if MaxIter<= 0 | abs(x3 - x1) < TolX | abs(f3 - f1) < TolFun

xo = x3;

fo = f3;

else

%%%%%根据求出的多项式值与区间中三点值的大小比较确定相应的新的三点

if x3 < x1

if f3 < f1

x012 = x0 x3 x1;

f012 = f0 f3 f1;

else

x012 = x3 x1 x2;

f012 = f3 f1 f2;

end

else

if f3 <= f1

x012 = x1 x3 x2;

f012 = f1 f3 f2;

else

x012 = x0 x1 x3;

f012 = f0 f1 f3;

end

end

%%%%%进行新一轮迭代

xo,fo = Opt_Quadratic(f,x012,TolX,TolFun,MaxIter-1);

end

3. 运行结果

相关推荐
wuyk55526 分钟前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
君顾16 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠7 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
南棱笑笑生7 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
指掀涛澜天下惊7 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
平头哥技术团队7 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
乌萨奇也要立志学C++7 小时前
【洛谷】kmp算法
开发语言·算法
禹凕7 小时前
Dijkstra算法详解与应用
python·算法
传奇开心果编程8 小时前
【Rust入门知识点学与练】第4课:条件判断 if / else
开发语言·学习·rust
m0_380743878 小时前
给 Claude API 调用补上超时重试和错误分类
开发语言·人工智能·php