两点二次插值法求极值matlab,三点二次插值法

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

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

%输出: xo为取最小值的点 fo为最小的函数值

if nargin < 5      %在函数体内获得实际输入的变量的个数

MaxIter =100; %最大迭代次数默认为100

end

if nargin < 4

TolFun= 1e-8; %函数值误差为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 =

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
(a) 解三次样条插值多项式的一次导数值时其在各插值点上的二次导数值应该满足的线性方程组,可以仿照课本中的推导方法,得到以下线性方程组: $$ \begin{cases} h_1M_0 + 2(h_1+h_2)M_1 + h_2M_2 = 3\frac{f(x_1)-f(x_0)}{h_1^2} - 3\frac{f(x_0)-f_{-1}}{h_0^2} \\ h_2M_1 + 2(h_2+h_3)M_2 + h_3M_3 = 3\frac{f(x_3)-f(x_2)}{h_3^2} - 3\frac{f(x_2)-f(x_1)}{h_2^2} \end{cases} $$ 其中,$M_0$ 和 $M_3$ 分别为边界点 $x_{-1}$ 和 $x_4$ 处的二次导数值,$h_i = x_{i+1} - x_i$,$f_{-1}$ 和 $f_4$ 分别为边界点处的函数值。 (b) 根据题目中的要,在边界点 $x_{-1}$ 和 $x_4$ 处,三次样条插值多项式的一阶导数值为0。因此,我们可以先出满足这个条件的 $M_0$ 和 $M_3$ 的值,然后在每个子区间上分别插值,得到整个区间上的三次样条插值多项式。 具体地,我们可以先计算出 $M_0$ 和 $M_3$ 的值: $$ \begin{cases} 2M_0 + M_1 = \frac{3}{h_1^2}(f(x_1)-f_{-1}) \\ h_2M_1 + 2(h_2+h_3)M_2 + h_3M_3 = 3\frac{f(x_3)-f(x_2)}{h_3^2} - 3\frac{f(x_2)-f(x_1)}{h_2^2} \\ M_2 + 2M_3 = \frac{3}{h_3^2}(f_4-f(x_3)) \end{cases} $$ 然后,在每个子区间 $[x_i, x_{i+1}]$ 上,我们可以使用课本中的方法,得到三次样条插值多项式的表达式: $$ S_i(x) = \frac{M_{i-1}}{6h_i}(x_{i+1}-x)^3 + \frac{M_i}{6h_i}(x-x_i)^3 + \frac{f(x_i)}{h_i}(x_{i+1}-x) + \frac{f(x_{i+1})}{h_i}(x-x_i) $$ 最后,我们可以在2000个等距点上计算出真实值和插值值的差,得到逐点误差,并使用 semilogy 图来表示。具体的 MATLAB 代码如下: ```matlab % (b) 插值 n = 2^4; % 子区间数 x = linspace(-1, 1, n+1); % 等距插值点 h = diff(x); f = sin(4*x.^2) + sin(2*4*x); f1 = [0 (3./h(2:end)).*(f(3:end)-f(2:end-1))-(3./h(1:end-1)).*(f(2:end-1)-f(1:end-2)) 0]; % 一次导数值 M = zeros(1, n+1); A = zeros(n-1, n-1); B = zeros(n-1, 1); for i = 1:n-1 A(i, i) = 2*(h(i)+h(i+1)); if i > 1 A(i, i-1) = h(i); end if i < n-1 A(i, i+1) = h(i+1); end B(i) = f1(i+1); end M(2:end-1) = A\B; S = zeros(1, 2000); x_interp = linspace(-1, 1, 2000); for i = 1:n idx = x_interp >= x(i) & x_interp <= x(i+1); S(idx) = (M(i)/(6*h(i))*(x_interp(idx)-x(i+1)).^3 + M(i+1)/(6*h(i))*(x(i+1)-x_interp(idx)).^3 + f(i)/h(i)*(x_interp(idx)-x(i+1)) + f(i+1)/h(i)*(x(i+1)-x_interp(idx))); end error = abs(S - (sin(4*x_interp.^2) + sin(2*4*x_interp))); semilogy(x_interp, error); ``` (c) 接下来,我们可以对不同的 $n$ 值($n=2^4,2^5,\cdots,2^{10}$)重复上述插值过程,并在2000个等距点上计算出逐点误差的最大值。然后,我们可以使用 loglog 图来描述插值区间上最大误差值随 $n$ 变化的情况。 具体的 MATLAB 代码如下: ```matlab % (c) 改变 n 的值,计算最大误差 n_values = 2.^(4:10); max_errors = zeros(size(n_values)); for k = 1:length(n_values) n = n_values(k); x = linspace(-1, 1, n+1); % 等距插值点 h = diff(x); f = sin(4*x.^2) + sin(2*4*x); f1 = [0 (3./h(2:end)).*(f(3:end)-f(2:end-1))-(3./h(1:end-1)).*(f(2:end-1)-f(1:end-2)) 0]; % 一次导数值 M = zeros(1, n+1); A = zeros(n-1, n-1); B = zeros(n-1, 1); for i = 1:n-1 A(i, i) = 2*(h(i)+h(i+1)); if i > 1 A(i, i-1) = h(i); end if i < n-1 A(i, i+1) = h(i+1); end B(i) = f1(i+1); end M(2:end-1) = A\B; S = zeros(1, 2000); x_interp = linspace(-1, 1, 2000); for i = 1:n idx = x_interp >= x(i) & x_interp <= x(i+1); S(idx) = (M(i)/(6*h(i))*(x_interp(idx)-x(i+1)).^3 + M(i+1)/(6*h(i))*(x(i+1)-x_interp(idx)).^3 + f(i)/h(i)*(x_interp(idx)-x(i+1)) + f(i+1)/h(i)*(x(i+1)-x_interp(idx))); end error = abs(S - (sin(4*x_interp.^2) + sin(2*4*x_interp))); max_errors(k) = max(error); end loglog(n_values, max_errors); ``` 运行上述程序可以得到逐点误差和最大误差随 $n$ 变化的图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值