当前位置:文档之家› 拟牛顿法(变尺度法)DFP算法的cc 源码

拟牛顿法(变尺度法)DFP算法的cc 源码

拟牛顿法(变尺度法)DFP算法的cc  源码
拟牛顿法(变尺度法)DFP算法的cc  源码

拟牛顿法(变尺度法)DFP算法的c/c++源码

#include "iostream.h"

#include "math.h"

void comput_grad(double (*pf)(double *x), int n, double *point, double *grad); //计算梯度

double line_search1(double (*pf)(double *x), int n, double *start, double

*direction); //0.618法线搜索

double line_search(double (*pf)(double *x), int n, double *start, double

*direction); //解析法线搜索

double DFP(double (*pf)(double *x), int n, double *min_point); //无约束变尺度法

//梯度计算模块

//参数:指向目标函数的指针,变量个数,求梯度的点,结果

void comput_grad(double (*pf)(double *x),

int n,

double *point,

double *grad)

{

double h=1E-3;

int i;

double *temp;

temp = new double[n];

for(i=1;i<=n;i++)

{

temp[i-1]=point[i-1];

}

for(i=1;i<=n;i++)

{

temp[i-1]+=0.5*h;

grad[i-1]=4*pf(temp)/(3*h);

temp[i-1]-=h;

grad[i-1]-=4*pf(temp)/(3*h);

temp[i-1]+=(3*h/2);

grad[i-1]-=(pf(temp)/(6*h));

temp[i-1]-=(2*h);

grad[i-1]+=(pf(temp)/(6*h));

temp[i-1]=point[i-1];

}

delete[] temp;

}

//一维搜索模块

//参数:指向目标函数的指针,变量个数,出发点,搜索方向

//返回:最优步长

double line_search(

double (*pf)(double *x),

int n,

double *start,

double *direction)

{

int i;

double step=0.001;

double a=0,value_a,diver_a;

double b,value_b,diver_b;

double t,value_t,diver_t;

double s,z,w;

double *grad,*temp_point;

grad=new double[n];

temp_point=new double[n];

comput_grad(pf,n,start,grad);

diver_a=0;

for(i=1;i<=n;i++)

diver_a=diver_a+grad[i-1]*direction[i-1];

do

{

b=a+step;

for(i=1;i<=n;i++)

temp_point[i-1]=start[i-1]+b*direction[i-1]; comput_grad(pf,n,temp_point,grad);

diver_b=0;

for(i=1;i<=n;i++)

diver_b=diver_b+grad[i-1]*direction[i-1];

if( fabs(diver_b)<1E-10 )

{

delete[] grad;

delete[] temp_point;

return(b);

}

if( diver_b<-1E-15 )

{

a=b;

diver_a=diver_b;

step=2*step;

}

}while( diver_b<=1E-15 );

for(i=1;i<=n;i++)

temp_point[i-1]=start[i-1]+a*direction[i-1];

value_a=(*pf)(temp_point);

for(i=1;i<=n;i++)

temp_point[i-1]=start[i-1]+b*direction[i-1];

value_b=(*pf)(temp_point);

do

{

s=3*(value_b-value_a)/(b-a);

z=s-diver_a-diver_b;

w=sqrt( fabs(z*z-diver_a*diver_b) ); //////////////////!!!!!!!!!!!!!!!!!!!!!!

t=a+(w-z-diver_a)*(b-a)/(diver_b-diver_a+2*w);

value_b=(*pf)(temp_point);

for(i=1;i<=n;i++)

temp_point[i-1]=start[i-1]+t*direction[i-1];

value_t=(*pf)(temp_point);

comput_grad(pf,n,temp_point,grad);

diver_t=0;

for(i=1;i<=n;i++)

diver_t=diver_t+grad[i-1]*direction[i-1];

if(diver_t>1E-6)

{

b=t;

value_b=value_t;

diver_b=diver_t;

}

else if(diver_t<-1E-6)

{

a=t;

value_a=value_t;

diver_a=diver_t;

}

else break;

}while( (fabs(diver_t)>=1E-6) && (fabs(b-a)>1E-6) );

delete[] grad;

delete[] temp_point;

return(t);

}

//无约束变尺度法DFP函数声明

//

//参数:pf指向目标函数的指针,n变量个数,min_point接受初始点、存放结果

//返回:极小点处函数值

//

double DFP(

double (*pf)(double *x),

int n,

double *min_point

)

{

int i,j;

int k=0;

double e=1E-5;

double g_norm;

double *g0=new double[n]; //梯度

double *g1=new double[n];

double *dg=new double[n];

double *p=new double[n]; //搜索方向 =-g

double t; //一维搜索步长

double *x0=new double[n];

double *x1=new double[n];

double *dx=new double[n];

double **H=new double*[n];

for (i=0; i

double **tempH=new double*[n];

for (i=0; i

double *gH=new double[n];

double *Hg=new double[n];

double num1;

double num2;

for(i=0;i

for(j=0;j

{

if(i==j) H[i][j]=1.0; // H0=I

else H[i][j]=0.0;

tempH[i][j]=0.0;

}

for(i=0;i

x0[i]=min_point[i];

comput_grad(pf,n,x0,g0);

g_norm=0.0;

for(i=0;i

g_norm=sqrt(g_norm);

if (g_norm

{

for(i=0;i

delete[] g0;

delete[] g1;

delete[] dg;

delete[] p;

delete[] x0;

delete[] x1;

delete[] dx;

for (i=0; i

delete []H;

for (i=0; i

delete []tempH;

delete[] gH;

delete[] Hg;

return pf(min_point);

}

for(i=0;i

do

{

t=line_search(pf,n,x0,p); for(i=0;i

comput_grad(pf,n,x1,g1);

g_norm=0.0;

for(i=0;i

g_norm=sqrt(g_norm);

//cout<

if (g_norm

{

for(i=0;i

delete[] g0;

delete[] g1;

delete[] dg;

delete[] p;

delete[] x0;

delete[] x1;

delete[] dx;

for (i=0; i

delete []H;

for (i=0; i

delete []tempH;

delete[] gH;

delete[] Hg;

return pf(min_point);

}

for(i=0;i

{

dx[i]=x1[i]-x0[i];

dg[i]=g1[i]-g0[i];

}

//////////////////求Hk+1的矩阵运算

//g*H,H*g

for(i=0;i

{

gH[i]=0.0;

Hg[i]=0.0;

}

for(i=0;i

{

for(j=0;j

{

gH[i]=gH[i]+dg[j]*H[j][i];

//Hg[i]=Hg[i]+H[i][j]*dg[j];

Hg[i]=gH[i];

}

}

//num1,num2

num1=0.0;

num2=0.0;

for(i=0;i

{

num1=num1+dx[i]*dg[i];

num2=num2+gH[i]*dg[i];

}

//tempH[i][j]

for(i=0;i

for(j=0;j

tempH[i][j]=0.0;

for(i=0;i

{

for(j=0;j

{

tempH[i][j]=tempH[i][j]+H[i][j];

tempH[i][j]=tempH[i][j]+dx[i]*dx[j]/num1; tempH[i][j]=tempH[i][j]-Hg[i]*gH[j]/num2; }

}

for(i=0;i

{

for(j=0;j

{

H[i][j]=tempH[i][j];

}

}

/////////////////////////////

//P

for(i=0;i

for(i=0;i

{

for(j=0;j

{

p[i]=p[i]-H[i][j]*g1[j];

}

}

for(i=0;i

{

g0[i]=g1[i];

x0[i]=x1[i];

}

k=k+1;

}while(g_norm>e);

for(i=0;i

delete[] g0;

delete[] g1;

delete[] dg;

delete[] p;

delete[] x0;

delete[] x1;

delete[] dx;

for (i=0; i

delete []H;

for (i=0; i

delete []tempH;

delete[] gH;

delete[] Hg;

return pf(min_point);

}

/////////////

double fun(double *x)

{

return 100*( x[1]-x[0]*x[0] )*( x[1]-x[0]*x[0] ) + (1-x[0])*(1-x[0]); }

void main()

{

int n=2;

double min_point[2]={-5,10};

double min_value=DFP(fun,n,min_point);

cout<

}

//0.618法线搜索

//

//参数:指向目标函数的指针,变量个数,出发点,搜索方向

//返回:最优步长

//

double line_search1(

double (*pf)(double *x),

int n,

double *start,

double *direction)

{

int i;

int k;

double l,a,b,c,u,lamda,t,e;

double *xa=new double[n];

double *xb=new double[n];

double *xc=new double[n];

double *xl=new double[n];

double *xu=new double[n];

//确定初始搜索区间

l=0.001;

a=0;

k=0;

do

{

k++;

c=a+l;

for(i=0;i

{

xc[i]=start[i]+c*direction[i];

xa[i]=start[i]+a*direction[i];

}

l=l/3;

}while( pf(xc) >= pf(xa) ); // ???

k=0;

do

{

k++;

l=2*l;

b=c+l;

for(i=0;i

{

xc[i]=start[i]+c*direction[i]; xb[i]=start[i]+b*direction[i]; }

a=c;

c=b;

}while( pf(xb) <= pf(xc) );

a=0;

b=0.1;

//寻优

t=0.618;

e=0.000001;

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

u=a+t*(b-a);

for(i=0;i

{

xl[i]=start[i]+lamda*direction[i];

xu[i]=start[i]+u*direction[i];

}

k=0;

do

{

k++;

if( pf(xl)

{

b=u;

u=lamda;

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

}

else

{

a=lamda;

lamda=u;

u=t*(b-a);

}

}while( b-a>=e ); lamda=(a+b)/2;

delete[] xa;

delete[] xb;

delete[] xc;

delete[] xl;

delete[] xu;

return lamda ;

}

拟牛顿法(变尺度法)DFP算法的cc 源码

拟牛顿法(变尺度法)DFP算法的c/c++源码 #include "iostream.h" #include "math.h" void comput_grad(double (*pf)(double *x), int n, double *point, double *grad); //计算梯度 double line_search1(double (*pf)(double *x), int n, double *start, double *direction); //0.618法线搜索 double line_search(double (*pf)(double *x), int n, double *start, double *direction); //解析法线搜索 double DFP(double (*pf)(double *x), int n, double *min_point); //无约束变尺度法 //梯度计算模块 //参数:指向目标函数的指针,变量个数,求梯度的点,结果 void comput_grad(double (*pf)(double *x), int n, double *point, double *grad) { double h=1E-3; int i; double *temp; temp = new double[n]; for(i=1;i<=n;i++) { temp[i-1]=point[i-1]; } for(i=1;i<=n;i++) { temp[i-1]+=0.5*h; grad[i-1]=4*pf(temp)/(3*h); temp[i-1]-=h; grad[i-1]-=4*pf(temp)/(3*h); temp[i-1]+=(3*h/2); grad[i-1]-=(pf(temp)/(6*h)); temp[i-1]-=(2*h); grad[i-1]+=(pf(temp)/(6*h)); temp[i-1]=point[i-1]; } delete[] temp; }

牛顿迭代法

牛顿迭代法 李保洋 数学科学学院信息与计算科学学号:060424067 指导老师:苏孟龙 摘要:牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,即牛顿迭代法.迭代法是一种不断用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“牛顿迭代法”属于近似迭代法,本文主要讨论的是牛顿迭代法,方法本身的发现和演变和修正过程,避免二阶导数计算的Newton迭代法的一个改进,并与中国古代的算法,即盈不足术,与牛顿迭代算法的比较. 关键词:Newton迭代算法;近似求解;收敛阶;数值试验;中国古代数学; 九章算术;Duffing方程;非线性方程;收敛速度;渐进性 0 引言: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“二分法”和“牛顿迭代法”属于近似迭代法. 迭代算法是用计算机解决问题的一种基本方法.它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值.具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制. (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败. 所以利用迭代算法解决问题,需要做好以下三个方面的工作: 1、确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 2、建立迭代关系式.所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 3、对迭代过程进行控制,在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地重复执行下去.迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定.对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件. 1牛顿迭代法:

变尺度法

一、变尺度法的基本思想 变尺度法是在牛顿法的基础上发展起来的,它和梯度法亦有密切关系。我们观察一下梯度法和阻尼牛顿法的迭代公式,即: 式——(1) 和——(2) 分析比较这两种方法可知:梯度法的搜索方向为,只需计算函数的一阶偏导数,计算工作量小,当迭代点远离最优点时对突破函数的非二次性极为有利,函数值下降很快,但是当迭代点接近最优点时收敛速度很慢。牛顿法的搜索方向为, 不仅需要计算一阶偏导数而且要计算二阶偏导数矩阵及其逆矩阵.计算工作璧很大,但牛顿法具有二次收敛性,当迭代点接近最优点时收敛速度很快。对这两种方法取其优,去其劣,迭代过程先用梯度法,后用牛顿法并避开牛顿法的赫森矩阵的逆矩阵的繁琐计算,这就是萌生建立“变尺度法”的基本构想。下面对变尺度法的基本思想进行阐述。 变尺度法所构成的迭代公式为: ——(3) 式中为最优步长因子,由一维搜索 而得;对照无约束优化迭代通式。变尺度法的搜索方向应为; 是根据需要人为构造的一个n×n阶对称矩阵,它在迭代过程中随迭代点的位置变化而变化。若在初始点取为单位矩阵取I,则式(3}就成为式(1)表示的梯度法迭代公式,搜索方向为负梯度方向。以后随着迭代过程不断地修正构造矩阵,使它在整个迭代过程中 逐步地逼近目标函数在极小点处的赫森矩阵的逆矩阵。当时。式(3)就成为式(2)表示的阻尼牛顿法迭代公式。这样,当迭代点逼近最优点时,搜索方向就趋于牛 顿方向。如能实现这种构想,那就综合了梯度法和牛顿法的优点,不直接计算,而是用变化的构造矩阵去逼近它,使算法更为有效。构造矩阵在迭代过程中是变

化的,称为变尺度矩阵。由于变尺度法的迭代形式与牛倾法类似,不同的是在迭代公式中用 来逼近,所以又称为“拟牛顿法”,变尺度法的搜索方向 ,最终要逼近牛顿方向,故又称为拟牛顿方向。 实现上述变尺度法的基本思想,关键在于如何产生这一合乎要求的变尺度矩阵,下面对此进行重点讨论。 二、构造变尺度矩阵的基本要求 1.为了使拟牛顿搜索方向朝着目标函 数值下降的方向,必须为对称正定矩阵。证明如下: 若有目标函数f(X}由点沿方向具有下降的性质,即,根 据梯度的性质,可知搜索方向与负梯度方向之间的夹角应成锐角,即两者的点积应大于零 将代入上式,则有 用矩阵表示为或 这表明变尺度矩阵必须是对称正定矩阵才能保证变尺度算法拟牛顿搜索方向是函数值下降方向。 2.要求构造的变尺度矩阵具有简单的迭代形式,能利用本次迭代信息以固定的格式构造下一次迭代的变尺度矩阵,可以写成

§2.3牛顿Newton法及其变形.doc

2.3 牛顿(Newton )法及其变形 一、Newton 迭代方法 牛顿迭代法计算公式的推导过程 设*x 是()0f x =的根,()f x 在*x 的邻域内具有二阶连续导数,在*x 的邻域内取一点0x ,使0()0f x '≠,则()f x 在*x 的邻域内连续,将它在0x 点二阶Taylor 展开得 2 0000000()()()()()()2! ()()() f f x f x f x x x x x f x f x x x ξ'''=+-+-'≈+- 又()0f x =,则有 000()()()0f x f x x x '+-≈ 故()0f x =的近似解000()()f x x x f x ≈-',记0100()() f x x x f x =-' 类似,在点1x 处Taylor 展开,可得: 111()() f x x x f x ≈-',记1211()()f x x x f x =-' 依次往下做,可得一般的迭代格式:

上述迭代格式称为求()0 f x=的解的牛顿迭代法。 几何意义 在点 00 (,()) x f x处作() f x的切线,交x轴于一点,求该点的横坐标。此切线方程为 000 ()()() y f x f x x x ' -=-, 当0 y=时,得0 () () f x x x f x =- ' ,正是 1 x的值。 类似地,在点(,()) k k x f x作函数() f x的切线,交x轴于一点,切线方程为 ()()() k k k y f x f x x x ' -=-, 当0 y=时,得 () () k k k f x x x f x =- ' ,正是 1 k x + 的值。 所以,牛顿迭代法又称为切线求根法。 例6用牛顿迭代法求方程x x e- =在0.5 x=附近的根。解.将原方程化为()0 x f x x e- =-=,则牛顿迭代格式为

牛顿插值法原理及应用

牛顿插值法 插值法是利用函数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

牛顿插值法试验报告

. 牛顿插值法一、实验目的:学会牛顿插值法,并应用算法于实际问题。 x?x)f(二、实验内容:给定函数,已知: 4832401.2)?.?1449138f(2.f.f(20)?1.414214(2.1) 549193.)?1f(2.4516575(f2.3)?1. 三、实验要求:以此作为函数2.15插值多项式在处的值,用牛顿插值法求4 次Newton( 1)2.15?N(2.15)。在MATLAB中用内部函数ezplot绘制出的近似值4次Newton插值多项式的函数图形。 (2)在MATLAB中用内部函数ezplot可直接绘制出以上函数的图形,并与作出的4次Newton插值多项式的图形进行比较。 四、实验过程: 1、编写主函数。打开Editor编辑器,输入Newton插值法主程序语句: function [y,L]=newdscg(X,Y,x) n=length(X); z=x; A=zeros(n,n);A(:,1)=Y';s=0.0; p=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 end C=A(n,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); L(k,:)=poly2sym(C); 0 / 3 . %%%%%%%%%%%%%%%%%% t=[2,2.1,2.2,2.3,2.4]; fx=sqrt(t); wucha=fx-Y; 以文件名newdscg.m保存。 2、运行程序。 (1)在MATLAB命令窗口输入: >> X=[2,2.1,2.2,2.3,2.4]; Y =[1.414214,1.449138,1.483240,1.516575,1.549193]; x=2.15;[y,P]=newdscg(X,Y,x) 回车得到:

数值计算(二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法))

本科生实验报告 实验课程数值计算方法 学院名称信息科学与技术学院 专业名称计算机科学与技术 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一六年五月二〇一六年五月

实验一非线性方程求根 1.1问题描述 实验目的:掌握非线性方程求根的基本步骤及方法,。 实验内容:试分别用二分法、简单迭代法、Newton迭代法、弦截法(割线法、双点弦法),求x5-3x3+x-1= 0 在区间[-8,8]上的全部实根,误差限为10-6。 要求:讨论求解的全过程,对所用算法的局部收敛性,优缺点等作分析及比较, 第2章算法思想 2.1二分法 思想:在函数的单调有根区间内,将有根区间不断的二分,寻找方程的解。 步骤: 1.取中点mid=(x0+x1)/2 2.若f(mid)=0,则mid为方程的根,否则比较与两端的符号,若与f(x0) 异号,则根在[x0,mid]之间,否则在[mid,x1]之间。 3并重复上述步骤,直达达到精度要求,则mid为方程的近似解。

2.2 简单迭代法 思想:迭代法是一种逐次逼近的方法,它是固定公式反复校正跟的近似值,使之逐步精确,最后得到精度要求的结果。 步骤:1.构造迭代公式f(x),迭代公式必须是收敛的。 2.计算x1,x1=f(x0). 3.判断|x1-x0|是否满足精度要求,如不满足则重复上述步骤。 4.输出x1,即为方程的近似解。 f为迭代函数

2.3 Newton迭代法 思想:设r 是的根,选取作为r的初始近似值,过点 做曲线 的切线L,L 的方程为,求出L与x轴交点的 横坐标,称x 1 为r的一次近似值。过点做曲线 的切线,并求该切线与x 轴交点的横坐标,称为r的二次近似值。重复以上过程,得r 的近似值序列,其中,称为r 的 次近似值 步骤:1.计算原函数的导数f’(x);构造牛顿迭代公式 2.计算 ,若f’(x0)=0,退出计算,否则继续向下迭代。 3.若|x1-x0|满足精度要求,x1即为方程的近似解。

计算方法实验报告 插值

实验名称:插值计算 1引言 在生产和科研中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际问题中,虽然可以断定所考虑的函数f(x)在区间[a,b]上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到在有限个点上的函数值。用这张函数表来直接求出其他点的函数值是非常困难的,在有些情况下,虽然可以写出f(x)的解析表达式,但由于结构十分复杂,使用起来很不方便。面对这些情况,构造函数P(x)作为f(x)的近似,插值法是解决此类问题比较古老却目前常用的方法,不仅直接广泛地应用与生产实际和科学研究中,而且是进一步学习数值计算方法的基础。 设函数y=f(x)在区间[a,b]上连续,且在n+1个不同的点a≤x0,x1……,xn≤b上分别取值y0,y1……,yn. 插值的目的就是要在一个性质优良、便于计算的函数φ中,求一简单函数P(x),使P(xi)=yi(i=0,1…,n)而在其他点x≠xi上,作为f(x)的近似。 通常,称区间[a,b]为插值区间,称点x0,x1,…,xn为插值节点,上式为插值条件,称函数类φ为插值函数类,称P(x)为函数f(x)在节点x0,x1,…,xn处的插值函数,求插值函数P(x)的方法称为插值法。 2实验目的和要求 用matlab定义分段线性插值函数、分段二次插值函数、拉格朗日插值函数,输入所给函 数表,并利用计算机选择在插值计算中所需的节点,计算f(0.15),f(0.31),f(0.47)的近似值。

3算法描述 1.分段线性插值流程图

2.分段二次插值流程图

3.拉格朗日插值流程图

4程序代码及注释 1.分段线性插值

改进的牛顿迭代法

改进的牛顿迭代法求解非线性方程 摘要:牛顿法思想是将非线性方程线性化,以线性方程的解逐步逼近非线性方程的解,但是其对初值、波动和可能出现的不收敛等缺点,而牛顿下山法克服了可能出现的发散的缺点。 关键词:牛顿法、牛顿下山法、非线性方程 一、牛顿法的迭代公式 设)(x f 在其零点*x 附近一阶连续可微,且0)(≠'x f ,当*0x x →时,由Taylor 公式有: ))(()()(000x x x f x f x f -'+≈ 以方程 0))(()(000=-'+x x x f x f 近似方程0)(=x f ,其解 ) ()(0001x f x f x x '-= 可作为方程的近似解,重复上述过程,得迭代公式 ),1,0(,) ()(1 ='-=+n x f x f x x n n n n 该方法称为牛顿迭代法。 二、牛顿法的改进 由于牛顿法缺点对牛顿法进行改进,使其计算简单,无需每次迭代都去计算)(x f ',且能够更好的收敛。 2.1简化的牛顿法 牛顿法的缺点之一是每次迭代都得去计算)(k x f '。为回避该问题,常用一个固定 )(k x f '迭代若干步后再求)(k x f '。这就是简化牛顿法的基本思想。 简化牛顿法的公式为: )(1k k k x cf x x -=+

迭代函数 )()(x cf x x -=? 若 2)(0,1)(1)(<'<<'-='x f c x f c x 即?,在根*x 附近成立,则迭代法局部收敛。 显然此法简化了计算量,却降低了收敛速度。 2.2牛顿下山法 牛顿法的缺点二是其收敛依赖与初值0x 的选取,若0x 偏离所求根*x 较远,则牛顿法可能发散。为防止迭代发散,我们对迭代过程再附加一项条件,即具有单调性: )()(1k k x f x f <+ 保证函数值稳定下降,然后结合牛顿法加快收敛速度,即可达目的。将牛顿法的计算结果 ) ()(1k k k k x f x f x x '-=+ 与前一步的近似值k x 适当加权平均作为新的改进值 k k k x x x )1(11λλ-+=++ 其中,称 )10(≤<λλ为下山因子,即为: ) ()(1k k k k x f x f x x '-=+λ 称为牛顿下山法。选择下山因子λ时,从 1=λ开始逐次将λ减半进行试算,直到条件成立为止。 三 举例说明 例1 求方程013=--x x 的根 (1)取5.10=x ,用牛顿法公式: 1 32131---=-+k k k k x x x x x 计算得:32472.1,32520.1,34783.1321===x x x

牛顿插值法的分析与应用

牛顿插值法的分析与应用 学生: 班级: 学号: : 指导教师: 成绩:

一.定义 )(x f 关于i x 的零阶差商 )(][i i x f x f = )(x f 关于i x ,j x 的一阶差商 i j i j j i x x x f x f x x f --= ][][],[ 依次类推,)(x f 关于i x ,1+i x ,……,k i x +的k 阶差商 i k i k i i k i i k i i i x x x x f x x f x x x f --= +-+++++] ,,[],,[],,,[111 二. 牛顿插值多项式 设给定的n+1个互异点))(,(k k x f x ,n k ,,1,0 =,j i x x ≠,j i ≠, 称满足条件 )()(k k n x f x N =,n k ,,1,0 = 的n 次多项式 )()](,,,[)](,[][)(10100100---++-+=n n n x x x x x x x f x x x x f x f x N 为Newton 插值多项式,称 ],[,)(],,,[)()()(0 10b a x x x x x x f x N x f x E n j j n n ∈-=-=∏= 为插值余项。 三.算法 步骤1:输入节点(xj ,yj ),精度ξ,计值点xx ,f0→p ,1→T ,1→i ; 步骤2:对k=1,2,……,i 依次计算k 阶均差 f[xi-k,xi-k+1,…,xi] = (f[xi-k+1,…,xi]- f[xi-k,…,xi])/( xi -xi-k ) 步骤3:(1)、若| f[x1,…,xi]- f[x0,…,xi-1]|< ξ,则p 为最终结果Ni-1(x),余项Ri-1= f[x0,…,xi](xx-xi-1)T 。 (2)、否则(xx-xi-1)*T →T ,p+ f[x0,…,xi]*T →p ,转步骤4。 步骤4:若i

牛顿插值法C语言程序

#include #include #define N 6 float sub(float a[],float b[],float x,float e); void main(void) { float u[N]={100,121,144,169,196,225}; float v[N]={10,11,12,13,14,15}; float x,y,e,*p1,*p2; printf("Input number x E=:"); scanf("%f%e",&x,&e); p1=u; p2=v; y=sub(p1,p2,x,e); printf("y=%f\n",y); } float sub(float *pp1,float *pp2,float x,float e) { float a[N],b[N],t[N],y,y1,c; int i,k; for(i=0;i

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 ,算法组织如下:

牛顿迭代法求平方根

牛顿迭代法求平方根 求n的平方根,先假设一猜测值X0 = 1,然后根据以下公式求出X1,再将X1代入公式右边,继续求出X2…通过有效次迭代后即可求出n的平方根,X k+1 (迭代公式) 简单推导 假设f(x)是关于X的函数: 求出f(x)的一阶导,即斜率: 简化等式得到: 然后利用得到的最终式进行迭代运算直至求到一个比较精确的满意值,为什么可以用迭代法呢理由是中值定理(Intermediate Value Theorem):

如果f函数在闭区间[a,b]内连续,必存在一点x使得f(x) = c,c是函数f在闭区间[a,b]内的一点 我们先猜测一X初始值,例如1,当然地球人都知道除了1本身之外任何数的平方根都不会是1。然后代入初始值,通过迭代运算不断推进,逐步靠近精确值,直到得到我们主观认为比较满意的值为止。例如要求768的平方根,因为252 = 625,而302 = 900,我们可先代入一猜测值26,然后迭代运算,得到较精确值:。 回到我们最开始的那个”莫名其妙”的公式,我们要求的是N的平方根,令x2 = n,假设一关于X的函数f(x)为: f(X) = X2 - n 求f(X)的一阶导为: f'(X) = 2X 代入前面求到的最终式中: X k+1 = X k - (X k2 - n)/2X k 化简即得到我们最初提到的那个求平方根的神奇公式了: 用泰勒公式推导 我之前介绍过在The Art and Science of C一书中有用到,其实牛顿迭代法也可以看作是泰勒公式(Taylor Series)的简化,先回顾下泰勒公式:

仅保留等式右边前两项: 令f(X0+ε) = 0,得到: 再令X1 = X0+ ε0,得到ε1…依此类推可知: 转化为: 引申 从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。 同样,我们还可以利用pascal语言来实现下那个最简单的求平方根的公式(尽管我们可以直接用sqrt()完成) program asd (input,output); var a,x,n,i:real; begin writeln('Please input a!');

数值分析求解非线性方程根的二分法,简单迭代法和牛顿迭代法

实验报告一:实验题目 一、 实验目的 掌握求解非线性方程根的二分法、简单迭代法和牛顿迭代法,并通过数值实验比较两种方法的收敛速度。 二、 实验内容 1、编写二分法、牛顿迭代法程序,并使用这两个程序计算 02)(=-+=x e x x f 在[0, 1]区间的解,要求误差小于 4 10- ,比较两种方法收敛速度。 2、在利率问题中,若贷款额为20万元,月还款额为2160元,还期为10年,则年利率为多少?请使用牛顿迭代法求解。 3、由中子迁移理论,燃料棒的临界长度为下面方程的根cot x =(x 2?1)/2x ,用牛顿迭代法求这个方程的最小正根。 4、用牛顿法求方程f (x )=x 3?11x 2+32x ?28=0的根,精确至8位有效数字。比较牛顿迭代法算单根和重根的收敛速度,并用改进的牛顿迭代法计算重根。 三、 实验程序 第1题: 02)(=-+=x e x x f 区间[0,1] 函数画图可得函数零点约为0.5。 画图函数: function Test1() % f(x) 示意图, f(x) = x + exp(x) - 2; f(x) = 0 r = 0:0.01:1; y = r + exp(r) - 2 plot(r, y); grid on 二分法程序: 计算调用函数:[c,num]=bisect(0,1,1e-4) function [c,num]=bisect(a,b,delta) %Input –a,b 是取值区间范围 % -delta 是允许误差 %Output -c 牛顿迭代法最后计算所得零点值 % -num 是迭代次数

ya = a + exp(a) - 2; yb = b + exp(b) - 2; if ya * yb>0 return; end for k=1:100 c=(a+b)/2; yc= c + exp(c) - 2; if abs(yc)<=delta a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if abs(b-a)

变尺度混沌优化方法及其应用

变尺度混沌优化方法及其应用 X 张 彤(北京航空航天大学14系,100083) 王宏伟 王子才 (哈尔滨工业大学) 摘 要 基于混沌变量,提出一种变尺度混沌优化方法。该方法不断缩小优化变量的搜索空间并不断提高搜索精度,从而有较高的搜索效率。应用该方法对6个测试函数进行优化计算得到了满意的效果。 关键词 变尺度,优化,混沌优化方法分类号 TP 301.6 1 引 言 混沌(Chaos)是一种较为普遍的非线性现象,它看似一片混乱的变化过程实际上含有内在的规律性。一个混沌变量在一定范围内有如下特点:1)随机性,即它的表现同随机变量一样杂乱;2)遍历性,即它不重复地历经空间内的所有状态;3)规律性,该变量是由确定的迭代方程导出的。文献[1]考虑过用混沌变量进行优化搜索。其基本思想是把混沌变量线性映射到优化变量的取值区间,然后利用混沌变量进行搜索。几个测试函数优化实例的仿真结果表明混沌优化方法寻优效率明显优于其它随机搜索算法,如模拟退火、遗传算法。然而进一步的仿真计算表明该方法对于搜索空间小时效果显著,但当搜索空间大时却不能令人满意。基于此,本文提出了变尺度混沌优化方法,其特点在于:1)根据搜索进程,不断缩小优化变量的搜索空间;2)根据搜索进程,不断改变“二次搜索”的调节系数。对几个常用的复杂测试函数的仿真计算表明本文所提算法明显优于文献[1]算法。 2 变尺度混沌优化方法 本文选择(1)式产生的混沌变量来进行优化搜索 x k +1=L ?x k (1.0-x k ) (1) 其中L =4。若需优化n 个参数,则任意设定(0,1)区间n 个相异的初值(注意不能为方程(1)的 不动点0.25,0.5,0.75),得到n 个轨迹不同的混沌变量。 对连续对象的全局极小值优化问题 min f (x 1,x 2,…,x n ) x i ∈[a i ,b i ], i =1,2,…,n (2) 本文提出的优化方法步骤如下(记f (x 1,x 2,…,x n )为f (x i )): Step 1 初始化k =0,r =0。x k i =x i (0),x * i =x i (0),a r i =a i ,b r i =b i ,其中i =1,2,…,n 。这里k 为混沌变量迭代标志,r 为细搜索标志,x j (0)为(0,1)区间n 个相异的初值,x *i 为当前得到的最优混沌变量,当前最优解f *初始化为一个较大的数。 Vol.14No.3  控 制 与 决 策CON TR OL AN D DE CI S I ON 1999年5月  May 1999 X 国家高等学校博士点学科专项科研基金(9521320)资助课题 1997-11-17收稿,1998-04-07修回

约束变尺度法

约束变尺度法 Newton 法最突出的优点是收敛速度快,在这一点上其它算法无法比拟的。因此,建议凡是Hesse 矩阵比较容易求出的问题,尽可能使用Newton 法求解。但是,Newton 法也有一个严重缺陷,就是每次迭代都要计算目标函数的Hesse 矩阵和它的逆矩阵,当问题的维数较大时,计算量迅速增加,从而就抵消了Newton 法的优点。为此,人们开始寻找一种算法既可以保持Newton 法收敛速度快的优点,又可以摆脱关于Hesse 矩阵的计算,这就是变尺度算法。 变尺度法是一种非常好的方法,其中DFP 算法和BFGS 算法。可以说,直到目前为止,在不用Hesse 矩阵的方法中是最好的算法。 一、拟Newton 法 为了吸收Newton 法收敛速度快的优点,同时避免Newton 法每次迭代都要计算目标函数的Hesse 矩阵和它的逆矩阵,人们提出了具有超线性收敛的拟Newton 法。 (一)拟Newton 法的基本原理 在Newton 法中的基本迭代公式 k k k k P t X X +=+1, 其中 1 =k t , ) ()]([12 k k k X f X f P ?? -=- 令 ) ()(2 k k k k X f g X f G ?=? =,

于是有 ,,,,21011=-=-+k g G X X k k k k 其中X0是初始点, gk 和 Gk 分别是目标函数f (X )在点 Xk 的梯度和Hesse 矩阵. 为了消除这个迭代公式中的Hesse 逆矩阵G-1k ,可用某种近似矩阵Hk=Hk(Xk)来替换它,即构造一矩阵序列{Hk}去逼近Hesse 逆矩阵序列{G-1k},此时 k k k k g H X X -=+1 事实上,式中 Pk= -Hk gk 无非是确定了第k 次迭代的搜索方向.为了取得更大的灵活性,考虑更一般的迭代公式 k k k k k g H t X X -=+1 其中步长tk 通过从Xk 出发沿Pk= -Hk gk 作直线搜索来确定.此式代表很广的一类迭代公式. 例如,当Hk=I (单位矩阵)时,它变为最速下降法的迭代公式。 附加条件 为了使Hk 确实与G-1k 近似并有容易计算的特点,必须对 Hk 附加某些条件: ⑴ 为保证迭代公式具有下降性质,要求 {Hk} 中的每一个矩阵都是对称正定的. 因为使搜索方向Pk= -Hk gk 是下降方向, 只要 <-=k k T k k T k g H g P g ⑵ 求Hk 之间的迭代具有简单形式. 可设为最简单的形式: k k k E H H +=+1

MATLAB 牛顿插值法例题与程序

题目一:多项式插值 某气象观测站在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)

matlab 牛顿插值法 三次样条插值法

(){} 21 ()(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 ,算法组织如下:

牛顿迭代法收敛定理

关于牛顿迭代法的课程设计实验指导 非线性方程(或方程组)问题可以描述为求 x 使得f (x ) = 0。在求解非线性方程的方法中,牛顿迭代法是求非线性方程(非线性方程组)数值解的一种重要的方法。牛顿是微积分创立者之一,微积分理论本质上是立足于对世界的这种认识:很多物理规律在微观上是线性的。近几百年来,这种局部线性化方法取得了辉煌成功,大到行星轨道计算,小到机械部件设计。牛顿迭代法正是将局部线性化的方法用于求解方程。 一、牛顿迭代法及其收敛速度 牛顿迭代法又称为牛顿-拉夫逊方法(Newton-Raphson method ),是一种在实数域和复数域上通过迭代计算求出非线性方程的数值解方法。方法的基本思路是利用一个根的猜测值x 0做初始近似值,使用函数f (x )在x 0处的泰勒级数展式的前两项做为函数f (x )的近似表达式。由于该表达式是一个线性函数,通过线性表达式替代方程中的求得近似解x 1。即将方程f (x ) = 0在x 0处局部线性化计算出近似解x 1,重复这一过程,将方程f (x ) = 0在x 1处局部线性化计算出x 2,求得近似解x 2,……。详细叙述如下:假设方程的解x *在x 0附近(x 0是方程解x *的近似),函数f (x )在点x 0处的局部线化表达式为 )()()()(000x f x x x f x f '-+≈ 由此得一次方程 0)()()(000='-+x f x x x f 求解,得 ) ()(0001x f x f x x '-= 如图1所示,x 1比x 0更接近于x *。该方法的几何意义是:用曲线上某点(x 0,y 0)的切线代替曲线,以该切线与x 轴的交点(x 1,0)作为曲线与x 轴的交点(x *,0)的近似(所以牛顿迭代法又称为切线法)。设x n 是方程解x *的近似,迭代格式 ) ()(1n n n n x f x f x x '-=+ ( n = 0,1,2,……) 就是著名的牛顿迭代公式,通过迭代计算实现逐次逼近方程的解。牛顿迭代法的最大优点是收敛速度快,具有二阶收敛。以著名的平方根算法为例,说明二阶收敛速度的意义。 例1.已知4.12≈,求2等价于求方程f (x ) = x 2 – 2 = 0的解。由于x x f 2)(='。 应用牛顿迭代法,得迭代计算格式 )/2(2 11n n n x x x +=+,(n = 0,1,2,……) 取x 0= 1.4为初值,迭代计算3次的数据列表如下 图1 牛顿迭代法示意图

拉格朗日插值法与牛顿插值法的比较

拉格朗日插值法与牛顿插值法的比较 [摘 要]在生产和科研中出现的函数是多样的。对于一些函数很难找出其解析表达式。即使在某些情况下,可以写出函数的解析表达式,但由于解析表达式的结构相当复杂,使用起来很不方便。插值法即是解决此类问题的一种古老的、然而却是目前常用的方法,它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。拉格朗日插值法和牛顿插值法则是二种常用的简便的插值法。本文即是讨论拉格朗日插值法和牛顿插值法的理论及二者的比较。 [关键词] 拉格朗日插值 牛顿插值 插值多项式 比较 一、 背景 在工程和科学研究中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际问题中,虽然可以断定所考虑的函数)(x f 在区间],[b a 上存在且连续,但却难以找到它的解析表达式,只能通过实验和观测得到在有限个点上的函数值(即一张函数表)。显然,要利用这张函数表来分析函数)(x f 的性态,甚至直接求出其他一些点上的函数值可能是非常困难的。面对这些情况,总希望根据所得函数表(或结构复杂的解析表达式),构造某个简单函数)(x P 作为)(x f 的近似。这样就有了插值法,插值法是解决此类问题目前常用的方法。 如设函数)(x f y =在区间],[b a 上连续,且在1+n 个不同的点b x x x a n ≤≤,,,10 上分别取值n y y y ,,,10 。 插值的目的就是要在一个性质优良、便于计算的函数类Φ中,求一简单函数)(x P ,使 ),,1,0()(n i y x P i i == 而在其他点i x x ≠上,作为)(x f 的近似。 通常,称区间],[b a 为插值区间,称点n x x x ,,,10 为插值节点,称式i i y x P =)(为插值条件,称函数类Φ为插值函数类,称)(x P 为函数)(x f 在节点n x x x ,,,10 处的插值函数。求插值函数)(x P 的方法称为插值法。 插值函数类Φ的取法不同,所求得的插值函数)(x P 逼近)(x f 的效果就不同。它的选择取决于使用上的需要,常用的有代数多项式、三角多项式和有理函数等。当选用代数多项式作为插值函数时,相应的插值问题就称为多项式插值。本文讨论的拉格朗日插值法与牛顿插值法就是这类插值问题。 在多项式插值中,最常见、最基本的问题是:求一次数不超过n 的代数多项式 n n x a x a a x P +++= 10)(

相关主题
文本预览
相关文档 最新文档