黄金分割法 二次插值 牛顿 matlab 程序一维搜索方法比较

黄金分割法 二次插值 牛顿  matlab 程序一维搜索方法比较
黄金分割法 二次插值 牛顿  matlab 程序一维搜索方法比较

一维搜索方法应用比较

一、黄金分割法

(1)黄金分割法的起源

黄金分割在文艺复兴前后,经过阿拉伯人传入欧洲,受到了欧洲人的欢迎,他们称之为"金法",17世纪欧洲的一位数学家,甚至称它为"各种算法中最可宝贵的算法"。这种算法在印度称之为"三率法"或"三数法则",也就是我们现在常说的比例方法。

其实有关"黄金分割",我国也有记载。虽然没有古希腊的早,但它是我国古代数学家独立创造的,后来传入了印度。经考证。欧洲的比例算法是源于我国而经过印度由阿拉伯传入欧洲的,而不是直接从古希腊传入的。

因为它在造型艺术中具有美学价值,在工艺美术和日用品的长宽设计中,采用这一比值能够引起人们的美感,在实际生活中的应用也非常广泛,建筑物中某些线段的比就科学采用了黄金分割,舞台上的报幕员并不是站在舞台的正中央,而是偏在台上一侧,以站在舞台长度的黄金分割点的位置最美观,声音传播的最好。就连植物界也有采用黄金分割的地方,如果从一棵嫩枝的顶端向下看,就会看到叶子是按照黄金分割的规律排列着的。在很多科学实验中,选取方案常用一种0.618法,即优选法,它可以使我们合理地安排较少的试验次数找到合理的西方和合适的工艺条件。正因为它在建筑、文艺、工农业生产和科学实验中有着广泛而重要的应用,所以人们才珍贵地称它为"黄金分割"。我国数学家华罗庚曾致力于推广优选法中的"0.618法",把黄金分割应用于生活实际及科学应用中。

黄金分割〔Golden Section〕是一种数学上的比例关系。黄金分割具有严格的比例性、艺术性、和谐性,蕴藏着丰富的美学价值。应用时一般取0.618 ,就像圆周率在应用时取3.14一样。

由于公元前6世纪古希腊的毕达哥拉斯学派研究过正五边形和正十边形的作图,因此现代数学家们推断当时毕达哥拉斯学派已经触及甚至掌握了黄金分割。

公元前4世纪,古希腊数学家欧多克索斯第一个系统研究了这一问题,并建立起比例理论。

公元前300年前后欧几里得撰写《几何原本》时吸收了欧多克索斯的研究成果,进一步系统论述了黄金分割,成为最早的有关黄金分割的论著。

中世纪后,黄金分割被披上神秘的外衣,意大利数家帕乔利称中末比为神圣比例,并专门为此著书立说。德国天文学家开普勒称黄金分割为神圣分割。

到19世纪黄金分割这一名称才逐渐通行。黄金分割数有许多有趣的性质,人类对它的实际应用也很广泛。最著名的例子是优选学中的黄金分割法或0.618法,是由美国数学家基弗于1953年首先提出的,70年代在中国推广。

(2)原理及应用

一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。

图1 黄金分割法原理图

黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种

方法。它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数,即只在单峰区间内才能进行一维寻优,其收敛效率较低。其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)

二、牛顿法

(1)起源

牛顿法最初由艾萨克·牛顿于1736年在Method of Fluxions 中公开提出。而事实上方法此时已经由Joseph Raphson于1690年在Analysis Aequationum中提出,与牛顿法相关的章节《流数法》在更早的1671年已经完成了。

(2)原理及应用

对于一个函数f(x),它的泰勒级数展开式是这样的

f(x)=f(x0)+f′(x0)(x?x0)+12f′′(x0)(x?x0)2+...+1n!fn(x0)(x?x0)n当使用牛顿法来求一个方程解的时候,它使用泰勒级数前两项来代替这个函数,即用?(x)代替f(x),其中:

?(x)=f(x0)+f′(x0)(x?x0)

令?(x)=0,则x=x0?f(x0)f′(x0)。

所以,牛顿法的迭代公式是xn+1=xn?f(xn)f′(xn)

牛顿法求解n的平方根求解n的平方根,其实是求方程x2?n=0的解利用上面的公式可以得到:xi+1=xi?x2i?n2xi=(xi+nxi)/2编程的时候核心的代码是:x = (x + n/x)/2

三、二次插值法

二次插值法亦是用于一元函数在确定的初始区间内搜索极小点的一种

方法。它属于曲线拟合方法的范畴。

(1)基本原理

在求解一元函数的极小点时,常常利用一个低次插值多项式来逼

近原目标函数,然后求该多项式的极小点(低次多项式的极小点比较容易计算),并以此作为目标函数的近似极小点。如果其近似的程度尚未达到所要求的精度时,可以反复使用此法,逐次拟合,直到满足给定的精度时为止。

常用的插值多项式为二次或三次多项式,分别称为二次插值法和三次

插值法。这里我们主要介绍二次插值法的计算公式。

假定目标函数在初始搜索区间中有三点、和

,其函数值分别为、和(图2},且满足,,即满足函数值为两头大中间小的性质。利用这三点及相应的函数值作一条二次曲线,其函数为一个二次多项式,式中、、为待定系数。

图2

根据插值条件,插值函数与原函数在插值结点、、处函数值相等,得

(2)

为求插值多项式的极小点,可令其一阶导数为零,即

(3)

解式(3)即求得插值函数的极小点(4)

式(4)中要确定的系数可在方程组(2)中利用相邻两个方程消去而得:

(5)

(6)

将式(5)、(6)代入式(4)便得插值函数极小值点的计算公式:

(7)

把取作区间内的另一个计算点,比较与两点函数值的大

小,在保持两头大中间小的前提下缩短搜索区间,从而构成新的三点搜索区间,再继续按上述方法进行三点二次插值运算,直到满足规定的精度要求为止,把得到的最后的作为的近似极小值点。上述求极值点的方法称为三点二

次插值法。

为便于计算,可将式(7)改写为

(8)

式中:

(9)

(10)

(2)应用

四、例题应用

(1)黄金分割法

求解y=n*n+2*n的最小值。

程序:

huangjinfenggefa.m

clear

clc

a=-3;b=5;lamda=0.618;epsilon=0.05;i=0; x1=b-lamda*(b-a);

f1=x1*x1+2*x1;

x2=a+lamda*(b-a);

f2=x2*x2+2*x2;

tic

while b-a>=epsilon

if f1>=f2

a=x1;x1=x2;f1=f2;

x2=a+lamda*(b-a);

f2=x2*x2+2*x2;

else

b=x2;x2=x1;

f2=f1;

x1=b-lamda*(b-a);

f1=x1*x1+2*x1;

end

fprintf('右边的区间距离');

disp(b-x2);

fprintf('左边的区间距离');

disp(x1-a);

i=i+1;

X=0.5*(b+a);

min=X*X+2*X;

fprintf('黄金分割法所得最小极值点为:%f\n',X); fprintf('黄金分割法所得最小极值为:%f\n',min); fprintf('迭代次数为:%f\n',i);

end

t=toc

运行结果:

右边的区间距离 1.8880

左边的区间距离 1.8886

黄金分割法所得最小极值点为:-0.528000

黄金分割法所得最小极值为:-0.777216

迭代次数为:1.000000

右边的区间距离 1.1674

左边的区间距离 1.1674

黄金分割法所得最小极值点为:-1.472000

黄金分割法所得最小极值为:-0.777216

迭代次数为:2.000000

右边的区间距离0.7214

左边的区间距离0.7212

黄金分割法所得最小极值点为:-0.888304 黄金分割法所得最小极值为:-0.987524 迭代次数为:3.000000

右边的区间距离0.4459

左边的区间距离0.4459

黄金分割法所得最小极值点为:-1.249028 黄金分割法所得最小极值为:-0.937985 迭代次数为:4.000000

右边的区间距离0.2755

左边的区间距离0.2754

黄金分割法所得最小极值点为:-1.026101 黄金分割法所得最小极值为:-0.999319 迭代次数为:5.000000

右边的区间距离0.1704

左边的区间距离0.1704

黄金分割法所得最小极值点为:-0.888420 黄金分割法所得最小极值为:-0.987550 迭代次数为:6.000000

右边的区间距离0.1052

左边的区间距离0.1053

黄金分割法所得最小极值点为:-0.973595 黄金分割法所得最小极值为:-0.999303 迭代次数为:7.000000

右边的区间距离0.0651

左边的区间距离0.0651

黄金分割法所得最小极值点为:-1.026189 黄金分割法所得最小极值为:-0.999314 迭代次数为:8.000000

右边的区间距离0.0402

左边的区间距离0.0402

黄金分割法所得最小极值点为:-0.993642 黄金分割法所得最小极值为:-0.999960

迭代次数为:9.000000

右边的区间距离0.0249

左边的区间距离0.0249

黄金分割法所得最小极值点为:-1.013756 黄金分割法所得最小极值为:-0.999811

迭代次数为:10.000000

右边的区间距离0.0154

左边的区间距离0.0153

黄金分割法所得最小极值点为:-1.001326 黄金分割法所得最小极值为:-0.999998

迭代次数为:11.000000

t =

0.0630

(3)牛顿法

求解y=n*n+2*n的最小值。

程序:

newton_1.m

function y = newton_1(x0,EPSI)

x(1)=x0;

b=1;

i=1;

while (abs(b)>EPSI)

i=i+1;

x(i)=x(i-1)-df(x(i-1))/df2(x(i-1));

b=x(i)-x(i-1);

fprintf('所得的极小值点为:%f\n',x(i)); end

y=x(i);

fprintf('总共迭代%f次\n',i-1);

end

newton_2.m

clear;

clc;

x0=input('x0=');

EPSI=input('EPSI=');

tic

X=newton_1(x0,EPSI);

t=toc

fprintf('牛顿法所得极小值点为%f\n',X); fprintf('牛顿法所得极小值为%f\n',f(X)); df.m

function y = f(n)

y=n*n+2*n;

end

df2.m

function y = df(n)

y=2*n+2;

end

f.m

function y = df2(n)

y=2;

end

运行结果:

x0=1

EPSI=0.05

所得的极小值点为:-1.000000

所得的极小值点为:-1.000000

总共迭代2.000000次

t =

0.0283

牛顿法所得极小值点为-1.000000

牛顿法所得极小值为-1.000000

(4)二次插值法

求解y=1/4*n^4-2/3*n^3-2*n^2-7*n+8;的最小值

程序:

ercichazhifa.m

clear;

clc;

i=1;

a=input('a=');

b=input('b=');

h=input('h=');

EPSI=input('EPSI=');

a1=a;

a2=(a+b)/2;

a3=b;

y1=f(a1);

y2=f(a2);

y3=f(a3);

c1=(y3-y1)/(a3-a1);

c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);

ap=0.5*(a1+a3-c1/c2);

yp=f(ap);

tic

while abs(yp-y2)>EPSI

if (ap-a2)*h>0

if y2>=yp

a1=a2;

y1=y2;

a2=ap;

y2=yp;

else

a3=ap;

y3=yp;

end

else

if y2>=yp

a3=a2;

y3=y2;

a2=ap;

y2=yp;

else

a1=ap;

y1=yp;

end

end

c1=(y3-y1)/(a3-a1);

c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);

ap=0.5*(a1+a3-c1/c2);

yp=f(ap);

if y2

A=a2;

Y=y2;

else

A=ap;

Y=yp;

end

fprintf('二次插值法所得极值点为%f\n',A); fprintf('二次插值法所得极值为%f\n',Y); fprintf('总共迭代:%f次\n',i);

M(i)=A;

i=i+1;

end

t=toc

N=1:i;

n=1:i;

plot(N,M(i-1));

f.m

function y = f(n)

y=1/4*n^4-2/3*n^3-2*n^2-7*n+8;

end

运行结果:

a=-3

b=5

h=1

EPSI=0.05

二次插值法所得极值点为-1.000000

二次插值法所得极值为-1.000000

总共迭代:1.000000次

t =

0.0133

(5)总结比较

当精度取为0.05时,黄金分割法所得最小极值为:-0.999998,

迭代次数为:11次,t = 0.0630s;牛顿法所得极小值点为-1.000000

总共迭代2.000000次,t =0.0283s;二次插值法所得极值为-1.00000,

总共迭代:1.000000次,t =0.0133s。

当精度取为0.0005时,黄金分割法所得最小极值为:-1.000000,

迭代次数为:21.000000,t =0.0660;牛顿法所得极小值为-1.000000,

总共迭代2.000000次,t =0.0081s;二次插值法所得极值为-1.00000,

总共迭代:1.000000次,t =0.0015s。

通过结果可以发现,在精度比较低的情况下,二次插值法具有优势,迭代次数少,而且花的时间少,其次是牛顿法,最后则是黄金分割法。当精度体高时,仍然是二次插值法具有优势,所迭代的次数比较少,而且用的时间也是最少。虽然黄金分割法比牛顿法的迭代次数多,但是黄金分割法却比牛顿法所用的时间少。

总的来说,二次插值法的程序较为复杂,但是高效,对于二次函数求极值问题有优势。牛顿法因为需要求二阶导数,随着精度大的不断提高,所用的时间也不断增多,而且限制于求解可微函数的极值。黄金分割法相比于其他两种以为搜索方法而言,随着精度的提升,所用时间短的优势便逐渐体现出来。

牛顿插值法原理及应用

牛顿插值法 插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。如果这特定函数是多项式,就称它为插值多项式。当插值节点增减时全部插值基函数均要随之变化,这在实际计算中很不方便。为了克服这一缺点,提出了牛顿插值。牛顿插值通过求各阶差商,递推得到的一个公式: f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...xn](x-x0 )...(x-xn-1)+Rn(x)。 插值函数 插值函数的概念及相关性质[1] 定义:设连续函数y-f(x) 在区间[a,b]上有定义,已知在n+1个互异的点 x0,x1,…xn上取值分别为y0,y1,…yn (设a≤ x1≤x2……≤xn≤b)。若在函数类中存在以简单函数P(x) ,使得P(xi)=yi,则称P(x) 为f(x)的插值函数. 称x1,x2,…xn 为插值节点,称[a,b]为插值区间。 定理:n次代数插值问题的解存在且唯一。

牛顿插值法C程序 程序框图#include void main() { float x[11],y[11][11],xx,temp,newton; int i,j,n; printf("Newton插值:\n请输入要运算的值:x="); scanf("%f",&xx); printf("请输入插值的次数(n<11):n="); scanf("%d",&n); printf("请输入%d组值:\n",n+1); for(i=0;i

牛顿插值法matlab程序解析

牛顿插值法在MATLAB 中的实现 经过n+1个不同的插值点12n+1,,x x x …,,构造牛顿插值公式 1211231212n+112n =[,]()[,,]()()[,,]()()()N f x x x x f x x x x x x x f x x x x x x x x x -+--++---(x )……… 注:牛顿插值法中,用到了插值公式 %我们以二次牛顿插值公式为例解析牛顿插值法的matlab 程序 function[c,d]=newpoly(x,y) %这里x 为3个节点的横坐标组成的向量,即()123,,x x x x =,y 为纵坐标的组成向量,即()()()()123,,y f x f x f x = %c 为所得的牛顿插值多项式的系数组成的向量 n=length(x); %测量向量x 的长度,即向量x 中元素i x 的个数,赋值给n ,所以n=3,注:这里的“n ”仅为变量,和公式中的次数n 不一样 d=zeros(n,n); d=zeros(3,3) %把变量d 定义为一个n 行,n 列的零矩阵,此矩阵用来储存各阶差商,格式完全等同于书中21页的表 d(:,1)=y ’; %此句是把向量y 的转置,即123()()()f x y f x f x ?? ?= ? ?? ?,赋值给零矩阵d 的第一列 %下面运用两个for 循环来构造书中21页的差商表 %第一个循环(父循环),循环变量为k for k=2:n %用来表示零矩阵d 中的第几行 %第二个循环(父循环),循环变量为k for j=k:n %用来表示零矩阵d 中的第几列 d(k,j)=(d(k,j-1)-d(k-1,j-1))/(x(k)-x(k-j+1)); %差商公式,其中d(k,j)表示零矩阵d 中的第k 行,第j 列的元素,d(k,j-1),d(k-1,j-1)等也类似,它们代表的元素随着双循环而变化,x(k-1)表示1k x -,这种计算差商的方法是根据差商表的排列位置而得来,具体解释见下面。 end end %下面以二次牛顿插值公式为例解析双循环构造差商表,让我们先来看看构造好的差商表 121232312333 () () [,] ()[,][,,]X f x d f x f x x f x f x x f x x x ????=??????

MAAB牛顿插值法例题与程序

题目一:多项式插值 某气象观测站在8:00(AM )开始每隔10分钟对天气作如下观测,用三次多项式插值函数(Newton )逼近如下曲线,插值节点数据如上表,并求出9点30分该地区的温度(x=10)。 二、数学原理 假设有n+1个不同的节点及函数在节点上的值(x 0,y 0),……(x n ,y n ),插值多项式有如下形式: )() )(()()()(n 10n 102010n x -x )(x -x x -x x P x x x x x x -??-+??+-++=αααα(1) 其中系数i α(i=0,1,2……n )为特定系数,可由插值样条i i n y x P =) ((i=0,1,2……n )确定。 根据均差的定义,把x 看成[a,b]上的一点,可得 f(x)=f (0x )+f[10x x ,](0x -x ) f[x,0x ]=f[10x x ,]+f[x,10x x ,](1x -x ) …… f[x,0x ,…x 1-n ]=f[x,0x ,…x n ]+f[x,0x ,…x n ](x-x n ) 综合以上式子,把后一式代入前一式,可得到: f(x)=f[0x ]+f[10x x ,](0x -x )+f[210x x x ,,](0x -x )(1x -x )+ …+f[x,0x ,…x n ](0x -x )…(x-x 1-n )+f[x,0x ,…x n ,x ])(x 1n +ω=N n (x )+) (x n R 其中 N n (x )=f[0x ]+f[10x x ,](0x -x )+f[210x x x ,,](0x -x )(1x -x )+ …+f[x,0x ,…x n ](0x -x )…(x-x 1-n )(2) )(x n R =f(x)-N n (x )=f[x,0x ,…x n ,x ]) (x 1n +ω(3) ) (x 1n +ω=(0x -x )…(x-x n ) Newton 插值的系数i α(i=0,1,2……n )可以用差商表示。一般有 f k =α[k 10x x x ??,](k=0,1,2,……,n )(4)

matlab实现数值分析报告插值及积分

Matlab实现数值分析插值及积分 摘要: 数值分析(numerical analysis)是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,是数学的一个分支,它以数字计算机求解数学问题的理论和方法为研究对象。在实际生产实践中,常常将实际问题转化为数学模型来解决,这个过程就是数学建模。学习数值分析这门课程可以让我们学到很多的数学建模方法。 分别运用matlab数学软件编程来解决插值问题和数值积分问题。题目中的要求是计算差值和积分,对于问题一,可以分别利用朗格朗日插值公式,牛顿插值公式,埃特金逐次线性插值公式来进行编程求解,具体matlab代码见正文。编程求解出来的结果为:=+。 其中Aitken插值计算的结果图如下: 对于问题二,可以分别利用复化梯形公式,复化的辛卜生公式,复化的柯特斯公式编写程序来进行求解,具体matlab代码见正文。编程求解出来的结果为: 0.6932 其中复化梯形公式计算的结果图如下:

问题重述 问题一:已知列表函数 表格 1 分别用拉格朗日,牛顿,埃特金插值方法计算。 问题二:用复化的梯形公式,复化的辛卜生公式,复化的柯特斯公式计算积分,使精度小于5。 问题解决 问题一:插值方法 对于问题一,用三种差值方法:拉格朗日,牛顿,埃特金差值方法来解决。 一、拉格朗日插值法: 拉格朗日插值多项式如下: 首先构造1+n 个插值节点n x x x ,,,10 上的n 插值基函数,对任一点i x 所对应的插值基函数 )(x l i ,由于在所有),,1,1,,1,0(n i i j x j +-=取零值,因此)(x l i 有因子 )())(()(110n i i x x x x x x x x ----+- 。又因)(x l i 是一个次数不超过n 的多项式,所以只 可能相差一个常数因子,固)(x l i 可表示成: )())(()()(110n i i i x x x x x x x x A x l ----=+- 利用1)(=i i x l 得:

matlab编程实现二分法,牛顿法,黄金分割法,最速下降matlab程序代码

用二 4224min ()f t t t t =--[,.]t ∈内的极小值点,要求准 1. function [t d]=erfenfa(a,b) k=1; %记录循环次数 while abs(a-b)>0.0005 c=(a+b)/2; C(k)=c; %存储每次循环中点c 的值 if ff(c)<0 a=c; end if ff(c)==0 t1=c; break ; end if ff(c)>0 b=c; end k=k+1; end t=(a+b)/2; %最终符合要求的值 d=f(t); %最优解 C k function y=f(t) y=t^4-2*t^2-4*t; function y=ff(t) y=4*t^3-4*t-4; 运行结果 >> [t d]=erfenfa(1,1.5) C = Columns 1 through 9 1.2500 1.3750 1.3125 1.3438 1.3281 1.3203 1.3242 1.3262 1.3252 Column 10 1.3247 k = 11

t = 1.3250 d = -5.7290 2.黄金分割法 f (x)=x3-2x+1 初始区间[0, 3],收敛精度0.5 function [t,f]=huangjinfenge(a,b) m=1-(sqrt(5)-1)/2; t2=a+m*(b-a) f2=g(t2); t1=a+b-t2 f1=g(t1); while abs(t1-t2)>0.5 if f1 [t,f]=huangjinfenge(0,3) t2 = 1.1459 t1 = 1.8541

0.618法的matlab实现

实验报告 实验题目: 0.618法的MATLAB实现学生姓名: 学号: 实验时间: 2013-5-13

一.实验名称: 0.618法求解单峰函数极小点 二.实验目的及要求: 1. 了解并熟悉0.618法的方法原理, 以及它的MATLAB 实现. 2. 运用0.618法解单峰函数的极小点. 三.实验内容: 1. 0.618法方法原理: 定理: 设f 是区间],[b a 上的单峰函数, ] ,[ ,)2()1(b a x x ∈, 且)2()1(x x <. 如果)()()2()1(x f x f >, 则对每一个],[)1(x a x ∈, 有)()()2(x f x f >; 如果)()()2()1(x f x f ≤, 则对每一个] ,[) 2(b x x ∈, 有)()()1(x f x f ≥. 根据上述定理, 只需选择两个试探点, 就可将包含极小点的区间缩短. 事实上, 必有 如果)()()2()1(x f x f >, 则],[)1(b x x ∈; 如果)()() 2()1(x f x f ≤, 则][)2(x a x ,∈. 0.618 法的基本思想是, 根据上述定理, 通过取试探点使包含极小点的区间(不确定区间)不断缩短, 当区间长度小到一定程度时, 区间上各点的函数值均接近极小值, 因此任意一点都可作为极小点的近似. 0.618 法计算试探点的公式: ). (618.0),(382.0k k k k k k k k a b a a b a -+=-+=μλ 2. 0.618法的算法步骤: ①置初始区间],[11b a 及精度要求0>L , 计算试探点1λ和1μ, 计算函数值)(1λf 和)(1μf . 计算公式是 ).(618.0 ),(382.011111111a b a a b a -+=-+=μλ 令1=k . ②若L a b k k <-, 则停止计算. 否则, 当)()(k k f f μλ>时, 转步骤③; 当)()(k k f f μλ≤时, 转步骤④. ③置k k a λ=+1, k k b b =+1, k k μλ=+1,)(618.01111++++-+=k k k k a b a μ, 计算函数值)(1+k f μ, 转步骤⑤.

拉格朗日插值、牛顿插值的matlab代码

实验五多项式插值逼近 信息与计算科学金融崔振威201002034031 一、实验目的: 拉格朗日插值和牛顿插值的数值实现 二、实验内容:p171.1、p178.1、龙格现象数值实现 三、实验要求: 1、根据所给题目构造相应的插值多项式, 2、编程实现两类插值多项式的计算 3、试分析多项式插值造成龙格现象的原因 主程序 1、拉格朗日 function [c,l]=lagran(x,y) %c为多项式函数输出的系数 %l为矩阵的系数多项式 %x为横坐标上的坐标向量 %y为纵坐标上的坐标向量 w=length(x); n=w-1; l=zeros(w,w); for k=1:n+1 v=1; for j=1:n+1 if k~=j v=conv(v,poly(x(j)))/(x(k)-x(j)) %对多项式做卷积运算end end l(k,:)=v; end c=y*l; 牛顿插值多项式主程序 function [p2,z]=newTon(x,y,t) %输入参数中x,y为元素个数相等的向量 %t为插入的定点 %p2为所求得的牛顿插值多项式 %z为利用多项式所得的t的函数值。 n=length(x); chaS(1)=y(1); for i=2:n x1=x;y1=y; x1(i+1:n)=[];

y1(i+1:n)=[]; n1=length(x1); s1=0; for j=1:n1 t1=1; for k=1:n1 if k==j %如果相等则跳出循环 continue; else t1=t1*(x1(j)-x1(k)); end end s1=s1+y1(j)/t1; end chaS(i)=s1; end b(1,:)=[zeros(1,n-1) chaS(1)]; cl=cell(1,n-1); %cell定义了一个矩阵 for i=2:n u1=1; for j=1:i-1 u1=conv(u1,[1 -x(j)]); %conv()用于多项式乘法、矩阵乘法 cl{i-1}=u1; end cl{i-1}=chaS(i)*cl{i-1}; b(i,:)=[zeros(1,n-i),cl{i-1}]; end p2=b(1,:); for j=2:n p2=p2+b(j,:); end if length(t)==1 rm=0; for i=1:n rm=rm+p2(i)*t^(n-i); end z=rm; else k1=length(t); rm=zeros(1,k1); for j=1:k1 for i=1:n rm(j)=rm(j)+p2(i)*t(j)^(n-i); end

牛顿插值MATLAB算法

MATLAB程序设计期中作业 ——编程实现牛顿插值 成员:刘川(P091712797)签名_____ 汤意(P091712817)签名_____ 王功贺(P091712799)签名_____ 班级:2009信息与计算科学 学院:数学与计算机科学学院 日期:2012年05月02日

牛顿插值的算法描述及程序实现 一:问题说明 在我们的实际应用中,通常需要解决这样的问题,通过一些已知的点及其对应的值,去估算另外一些点的值,这些数据之间近似服从一定的规律,于是,这就引入了插值法的思想。 插值法是利用函数f (x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f (x)的近似值。如果这特定函数是多项式,就称它为插值多项式。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值。 二:算法分析 newton 插值多项式的表达式如下: 010011()()()()()n n n N x c c x x c x x x x x x -=+-+???+--???- 其中每一项的系数c i 的表达式如下: 12011010 [,,,][,,,] [,,,]i i i i i f x x x f x x x c f x x x x x -???-???=???= - 即为f (x)在点01,,,i x x x ???处的i 阶差商,([]()i i f x f x =,1,2,,i n = ),由差商01[,,,]i f x x x ???的性质可知: () 010 1 [,,,]()i i i j j k j k k j f x x x f x x x ==≠???=-∑∏ 牛顿插值的程序实现方法: 第一步:计算[][][][]001012012,,,,,,,n f x f x x f x x x f x x x x 、、、 、。 第二步:计算牛顿插值多项式中01[,,,]i f x x x ???011()()()i x x x x x x ---???-,1,2,,i n = ,得到n 个多项式。

黄金分割法,进退法,原理及流程图

1黄金分割法的优化问题 (1)黄金分割法基本思路: 黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。因此,这种方法的适应面非常广。黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1,a2,并计算其函数值。a1,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。 (2)黄金分割法的基本原理 一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。

黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数[6],即只在单峰区间内才能进行一维寻优,其收敛效率较低。其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。如果f(a1)>f(a2),令 a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)

牛顿插值法的MATLAB综合程序

6.3.5 牛顿插值法的MATLAB 综合程序 求牛顿插值多项式、差商、插值及其误差估计的MATLAB 主程序 function [y,R,A,C,L]=newdscg(X,Y,x,M) n=length(X); m=length(x); for t=1:m z=x(t); A=zeros(n,n);A(:,1)=Y'; s=0.0; p=1.0; q1=1.0; c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)- A(i-1,j-1))/(X(i)-X(i-j+1)); end q1=abs(q1*(z-X(j-1)));c1=c1*j; end C=A(n,n);q1=abs(q1*(z-X(n))); for k=(n-1):-1:1 C=conv(C,poly(X(k))); d=length(C);C(d)=C(d)+A(k,k); end y(k)= polyval(C, z); end R=M*q1/c1;L(k,:)=poly2sym(C); 例6.3.6 给出节点数据00.27)00.4(=-f ,00.1)00.0(=f ,00.2)00.1(=f ,00.17)00.2(=f ,作三阶牛顿插值多项式,计算)345.2(-f ,并估计其误差. 解 首先将名为newdscg.m 的程序保存为M 文件,然后在MATLAB 工作窗口输入程序 >> syms M,X=[-4,0,1,2]; Y =[27,1,2,17]; x=-2.345; [y,R,A,C,P]=newdscg(X,Y,x,M) 运行后输出插值y )345.2(-≈f 及其误差限公式R ,三阶牛顿插值多项式P 及其系数向量C ,差商的矩阵A 如下 y = 22.3211 R = 65133/562949953421312*M (即R =2.3503*M ) A= 27.0000 0 0 0 1.0000 -6.5000 0 0 2.0000 1.0000 1.5000 0 17.0000 15.0000 7.0000 0.9167 C = 0.9167 4.2500 -4.1667 1.0000 P = 11/12*x^3+17/4*x^2-25/6*x+1

matlab_牛顿插值法_三次样条插值法

(){} 2 1 ()(11),5,10,20: 1252 1()1,(0,1,2,,)()2,(0,1,2,,)() ()2 35,20:1100 (i i i i n n k k k Newton f x x n x f x x i i n f x n x y i n Newton N x S x n x k y f x = -≤≤=+=-+====-+ = 题目:插值多项式和三次样条插值多项式。已知对作、计算函数在点处的值;、求插值数据点 的插值多项式和三次样条插值多项式;、对计算和相应的函数值),()() (1,2,,99)4:()max ()()max ()n k n k n k n k n k n k k k N x S x k E N y N x E S y S x ==-=- 和; 、计算,; 解释你所得到的结果。 算法组织: 本题在算法上需要解决的问题主要是:求出第二问中的Newton 插值多项式 )(x N n 和三次样条插值多项式()n S x 。如此,则第三、四问则迎刃而解。计算两 种插值多项式的算法如下: 一、求Newton 插值多项式)(x N n ,算法组织如下: Newton 插值多项式的表达式如下: )())(()()(110010--???--+???+-+=n n n x x x x x x c x x c c x N 其中每一项的系数c i 的表达式如下: 1102110) ,,,(),,,(),,,(x x x x x f x x x f x x x f c i i i i i -???-???= ???=- 根据i c 以上公式,计算的步骤如下: ?? ??? ?? ?????+??????? ???????????----) ,,,,(1) ,,,(),,,,(),(,),,(2)(,),(),(11101111011010n n n n n n n n x x x x f n x x x f x x x f n x x f x x f x f x f x f 、计算、计算、计算、计算 二、求三次样条插值多项式)(x S n ,算法组织如下:

最优化方法之修正牛顿法matlab源码(含黄金分割法寻找步长)

revisenewton.m syms x1 x2 x3 xx; % f = x1*x1 +x2*x2 -x1*x2 -10*x1 -4*x2 + 60 ; % f = x1^2 + 2*x2^2 - 2*x1 *x2 -4*x1 ; f = 100 * (x1^2 - x2^2) + (x1 -1 )^2 ; hessen = jacobian(jacobian(f , [x1,x2]),[x1,x2]) ; gradd = jacobian(f , [x1,x2]) ; X0 = [0,0]' ; B = gradd' ; x1 = X0(1); x2 = X0(2); A = eval(gradd) ; % while sqrt( A(1)^2 + A(2)^2) >0.1 i=0; while norm(A) >0.1 i = i+1 ; fprintf('the number of iterations is: %d\n', i) if i>10 break; end B1 = inv(hessen)* B ; B2= eval(B1); % X1 = X0 - B2 % X0 = X1 ; f1= x1 + xx * B2(1); f2= x2 + xx* B2(2); % ff = norm(BB) ? syms x1 x2 ; fT=[subs(gradd(1),x1,f1),subs(gradd(2),x2,f2)]; ff = sqrt((fT(1))^2+(fT(2))^2); MinData = GoldData(ff,0,1,0.01); x1 = X0(1); x2 = X0(2); x1 = x1 + MinData * B2(1) x2 = x2 + MinData * B2(2) A = eval(gradd) End GoldData.m function MiniData = GoldData( f,x0,h0,eps) syms xx;

matlab计算拉格朗日牛顿及分段线性插值的程序

《工程常用算法》综合实践作业二 完成日期: 2013年 4月 14 日 班级 学号 姓名 主要工作说明 自评成绩 0718 2010071826 崔洪亮 算式与程序的编写 18 0718 2010071815 侯闰上 流程图的编辑,程序的审查 0718 2010071809 赵化川 报告的整理汇总 一.作业题目:三次样条插值与分段插值 已知飞机下轮廓线数据如下: x 3 5 7 9 11 12 13 14 15 y 0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6 飞机下轮廓线形状大致如下图所示: 要求分别用拉格朗日插值法、Newton 插值法、分段线性插值法和三次样条插值法计算x 每改变0.5时y 的值,即x 取 0.5, 1, 1.5, … , 14.5 时对应的y 值。比较采用不同方法的计算工作量、计算结果和优缺点。 二.程序流程图及图形 1.拉格朗日插值法 开始 x,y,x0 Length (x)==l Ength (y)? n=length (x) i=1:n,l=1。 j=1:i-1&j=i+1:n l=l.*(x0-x(j)/x(i)-x(j) f=f+l*y(i) 结束 否 是 机翼 下轮廓线

2.牛顿插值法 开始 x,y,xi Length(x)==l ength(y)? n=length(x)Y=zeros (n),Y (:1)=y,f=0 a=1:n-1,b=1:n-a,Y(b,a+1)=(Y (b+1,a)-Y(b,a))/(x (b+a)-x(b)) i=1:n,z=1 结束 j=1:i-1,z=z.*(xi-x(j)) f=f+Y(1,i)*z 否 是 3.分段线性插值法 开始 x ,y ,x0 length (x )==length(y)? k=1:n-1 x(k)<=x0&x0《=x(k+1) temp=x(k)-x(k+1) f=(x0-x(k+1))/temp*y(k)+(x0-x(k))/(-temp)*y(k+1) 结束 否否 是 是 三.matlab 程序及简要的注释(m 文件) 1.拉格朗日插值法 2.牛顿插值法 function f=newdun(x,y,xi) %x 为已知数据点的x 坐标向量 %y 为已知数据点的y 坐标向量 function f=lang(x,y,x0) %x 为已知数据点的x 坐标向量 %y 为已知数据点的y 坐标向量

均差牛顿插值MATLAB,M文件

%均差牛顿插值 function [ f y f0 ] = newton1( X,Y,x0 ) if nargin<3 error('Requires at least three input arguments.'); end if length(X)==length(Y) n=length(X); else error('length must equal') end syms x s=Y(1); l=1.0; y=zeros(n); y(1:n,1)=Y'; for i=2:n for j=2:i y(i,j)=(y(i,j-1)-y(j-1,j-1))/(X(i)-X(j-1)); if i==j l=l*(x-X(i-1)); s=s+y(i,i)*l; end end end f=simple(s); f0=subs(f,x0); function [ f f0 y] = newton2( X,Y,x0 ) if nargin<3 error('Requires at least three input arguments.'); end if length(X)==length(Y) n=length(X); else error('length must equal') end syms x s=Y(1); l=1.0; y=zeros(n) y(1:n,1)=Y'; for i=2:n for j=2:i y(i,j)=(y(i,j-1)-y(i-1,j-1))/(X(i)-X(i-j+1)); if i==j l=l*(x-X(i-1)); s=s+y(i,i)*l; end end end f=simple(s); f0=subs(f,x0);

最优化牛顿法最速下降法共轭梯度法matlab代码

牛顿法 迭代公式:(1)2()1()[()]()k k k k x x f x f x +-=-?? Matlab 代码: function [x1,k] =newton(x1,eps) hs=inline('(x-1)^4+y^2'); 写入函数 ezcontour(hs,[-10 10 -10 10]); 建立坐标系 hold on; 显示图像 syms x y 定义变量 f=(x-1)^4+y^2; 定义函数 grad1=jacobian(f,[x,y]); 求f 的一阶梯度 grad2=jacobian(grad1,[x,y]); 求f 的二阶梯度 k=0; 迭代初始值 while 1 循环 grad1z=subs(subs(grad1,x,x1(1)),y,x1(2)); 给f 一阶梯度赋初值 grad2z=subs(subs(grad2,x,x1(1)),y,x1(2)); 给f 二阶梯度赋初值 x2=x1-inv(grad2z)*(grad1z)'; 核心迭代公式 if norm(x1-x2)

end end end 优点:在极小点附近收敛快 缺点:但是要计算目标函数的hesse 矩阵 最速下降法 1. :选取初始点xo ,给定误差 2. 计算一阶梯度。若一阶梯度小于误差,停止迭代,输出 3. 取()()()k k p f x =? 4. 10 t ()(), 1.min k k k k k k k k k k t f x t p f x tp x x t p k k +≥+=+=+=+进行一维搜索,求,使得令转第二步 例题: 求min (x-2)^4+(x-2*y)^2.初始值(0,3)误差为0.1 (1)编写一个目标函数,存为f.m function z = f( x,y ) z=(x-2.0)^4+(x-2.0*y)^2; end (2)分别关于x 和y 求出一阶梯度,分别存为fx.m 和fy.m function z = fx( x,y ) z=2.0*x-4.0*y+4.0*(x-2.0)^3; end 和 function z = fy( x,y )

MATLAB黄金分割法课程论文--分析

中南林业科技大学 本科课程论文 学院:理学院 专业年级:14级信息与计算科学2班 学生姓名:邱文林学号:20144349 课程:MATLAB程序设计教程 设计题目:基于MATLAB的黄金分割法与抛物线插值法指导教师:龚志伟

2016年4月

中文摘要 为了求解最优化模型的最优解,可使用基于MATLAB算法编程的黄金分割法与抛物线插值法,来实现求解的过程。黄金分割法是通过所选试点的函数值而逐步缩短单谷区间来搜索最优点,利用迭代进而得出结论。抛物线插值法亦称二次插值法,是一种多项式插值法,逐次以拟合的二次曲线的极小点,逼近原寻求函数极小点的一种方法。通过将MATLAB与最优化问题相结合,不仅可以加深对黄金分割法、抛物线插值法的基本理解和算法框图及其步骤的全面理解,也有利于帮助我们掌握MATLAB的使用方法。 关键词:MATLAB,黄金分割法,抛物线插值法,最优解,迭代

英文摘要 In order to solve the optimization model of the optimal solution, using MATLAB algorithm based on the golden section method and the parabola interpolation method, to realize the process of solving. The golden section method is used to search the most advantage through the function value of the selected pilot, which can be used to search for the most advantage. Parabolic interpolation method, also known as the two interpolation method, is a polynomial interpolation method, successive to fit the two curve of the minimum point, the original search function to find a very small point of the method. By combining MATLAB and optimization problems can not only deepen the comprehensive understanding of the golden section method, the parabola interpolation basic understanding and block diagram of the algorithm and steps, but also conducive to help us to grasp the method of using MATLAB. Key words: MATLAB, golden section method, parabolic interpolation method, optimal solution, iteration

插值MATLAB程序-数值分析

插值MATLAB程序(可以输出多项式)—数值分析 1.拉格朗日多项式逼近 function [C,L,y]=lagran(X,Y) %拉格朗日多项式逼近 w=length(X); L=zeros(w,w); for k=1:w V=1; for j=1:w if k~=j V=conv(V,poly(X(j)))/(X(k)-X(j)); end end L(k,:)=V; end C=Y*L; y=poly2sym(C,'x'); 2.牛顿插值多项式 function [C,D,y]=newpoly(X,Y) %牛顿插值多项式 n=length(X); D=zeros(n,n); D(:,1)=Y'; for j=2:n for k=j:n D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1)); end end C=D(n,n); for k=(n-1):-1:1 C=conv(C,poly(X(k))); m=length(C); C(m)=C(m)+D(k,k); end y=poly2sym(C,'x'); 3.切比雪夫逼近 function [C,X,Y]=cheby(fun,n,a,b) %切比雪夫逼近 if nargin==2 a=-1;b=1; end

d=pi/(2*n+2); C=zeros(1,n+1); for k=1:n+1 X(k)=cos((2*k-1)*d); end X=(b-a)*X/2+(a+b)/2; x=X; Y=eval(fun); for k=1:n+1 z=(2*k-1)*d; for j=1:n+1 C(j)=C(j)+Y(k)*cos((j-1)*z); end end C=2*C/(n+1); C(1)=C(1)/2;

MATLAB拉格郎日插值法与牛顿插值法构造插值多项式

姓名:樊元君学号:2012200902 日期:2012.10.25 1.实验目的: 掌握拉格郎日插值法与牛顿插值法构造插值多项式。 2.实验内容: 分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何一组插值节点,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。 已知下列函数表 求x=0.5635时的函数值。

3.程序流程图: ●拉格朗日插值法流程图:

●牛顿插值法流程图:

4.源程序: ●拉格朗日插值法:function [] = LGLR(x,y,v) x=input('X数组=:'); y=input('Y数组='); v=input('插值点数值=:'); n=length(x); u=0; for k=1:n t=1; for j=1:n if j~=k t=t*(v-x(j))/(x(k)-x(j)); end end u=u+t*y(k); end disp('插值结果=');disp(u); end

●牛顿插值法: function [] = Newton(x,y,v) x=input('X数组=:'); y=input('Y数组=:'); v=input('插值点数值=:'); n=length(x); t=zeros(n,n); u=0; for i=1:n t(i,1)=y(i); end for j=2:n for i=2:n if i>=j t(i,j)=(t(i,j-1)-t(i-1,j-1))/(x(i)-x(i-j+1)); end end end for k=1:n s=1; m=1; for j=1:k if j

相关文档
最新文档