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.** **运行结果** ![](https://file.jishuzhan.net/article/1684201156638674945/1bfaa5bf0ee34236b97100124889d7ab.png) ![](https://file.jishuzhan.net/article/1684201156638674945/91b2447b957f48e1b62555b5c7cd9a76.png)

相关推荐
代码的奴隶(艾伦·耶格尔)18 分钟前
后端快捷代码
java·开发语言
hie9889437 分钟前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
Jay_51539 分钟前
C++多态与虚函数详解:从入门到精通
开发语言·c++
路来了40 分钟前
Python小工具之PDF合并
开发语言·windows·python
杰克尼1 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield2 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习
我不是哆啦A梦2 小时前
破解风电运维“百模大战”困局,机械版ChatGPT诞生?
运维·人工智能·python·算法·chatgpt
xiaolang_8616_wjl2 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
WJ.Polar2 小时前
Python数据容器-list和tuple
开发语言·python
small_wh1te_coder2 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c