渐变的c语言(渐变的矩阵函数)

今天给大家分享一下C语言中梯度计算的知识,也会讲解一下矩阵函数的梯度计算。如果你碰巧解决了你现在面临的问题,别忘了关注这个网站,现在就开始吧!

这篇文章的列表: 1.求C语言编程高手 2、C语言对于有限的楼层数,可以用switch,那么N层楼,用什么呢? 3.C语言问题如图所示(需要switch语句) 4.机械优化设计变尺度法的c语言程序。 求C语言编程高手 C语言中的数字配方

书和附的程序都有完整的程序。不过我封装了它的C版本,可以用来求单参数或者多参数的极值。完整的头文件是:

#ifndef __OPTIMIZATION_H__

#定义__优化_H__

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

//类优化

//

//$查找函数的一个或多个参数的最小值

//

//默认情况下,此类优化一个参数。一般只需输入优化参数的个数即可。

//可以使用优化目标函数。

//

//...主要代码来自:

//C语言中的数字配方

//科学计算的艺术

//第二版

//威廉·普雷斯·索尔·图科尔斯基

//威廉·维特林·布赖恩·弗兰纳里

//

//中文翻译:

// C数值算法(第二版),胡建伟,赵智勇,薛云华译。

//北京电子工业出版社(2005)

//

//作者:冯健

//电子邮件:fengj@tom.com

//2006年12月9日

//

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

//

//输入功能:

//

// @MaxIterationStep:最大迭代次数,默认为1000次。

// @ParameterNumbers:优化参数的个数,默认为1。

// @InitMatrix:初始化矩阵参数(N*N),默认。

// @Tolerance: tolerance,默认为1E-7。

//

//执行函数:

//

// @Executepowell:使用powell方法的多参数优化。

// @Executebrent:使用brent方法的单参数优化。

//

//输出函数:

//

//@ optimizedparameters:优化结果数据

// @ObjectiveFunctionValue:目标函数在优化值处的值。

//

//使用示例:

//

// 1.单参数

// double objfun(双a){

//double sum = 0;

//for(int I = 0;I数据点;我)

// sum = SQR(ExpsC语言问题如图(需要switch语句)。 # includestdio.h

int main() {

//金额的四个梯度

int数组装载.

/*

Tt -一维搜索的初始步长

Ff -差分法计算梯度时的步长。

终止迭代的交流收敛精度

一维搜索的Ad收敛精度

设计变量的n维

Xk[n] -迭代初始点

*/

# includestdio.h

#includestdlib.h

#包含math.h

#includeconio.h

#定义tt 0.01

#定义ff 1.0e-6

#定义ac 1.0e-6

#定义广告1.0e-6

#定义n 2

双ia;

双fny(双*x)

{

double x1=x[0],x2 = x[1];

双f;

f = x1 * x1 2 * x2 * x4 * x2 * x1 * x2;

返回f;

}

双*迭代(双*x,双a,双*s)

{

double * x1

int I;

x1 =(double *)malloc(n * sizeof(double));

for(I = 0;在;我)

x1[I]= x[I]a* s[I];

返回x1;

}

双func(双*x,双a,双*s)

{

double * x1

双f;

x1=iterate(x,a,s);

f = fny(x1);

返回f;

}

无效查找(双a[3],双f[3],双*xk,双*s)

{

双t = TT;

int I;

双a1,f1;

a[0]= 0;f[0]=func(xk,a[0],s);

for(I = 0;;我)

{

a[1]= a[0]t;

f[1]=func(xk,a[1],s);

if(f[1]f[0])break;

if(fabs(f[1]-f[0])=ad)

{

t =-t;

a[0]= a[1];f[0]= f[1];

}

其他

{

if(ia==1)返回;//中断

t = t/2;ia = 1;

}

}

for(I = 0;;我)

{

a[2]= a[1]t;

f[2]=func(xk,a[2],s);

if(f[2]f[1])破;

t = 2 * t

a[0]= a[1];f[0]= f[1];

a[1]= a[2];f[1]= f[2];

}

if(a[0]a[2])

{

a1 = a[0];

f1 = f[0];

a[0]= a[2];

f[0]= f[2];

a[2]= a1;

f[2]= f1;

}

返回;

}

双拉格朗日(双*xk,双*ft,双*s)

{

int I;

双a[3],f[3];

双b,c,d,aa;

finding(a,f,xk,s);

for(I = 0;;我)

{

if(ia = = 1){ aa = a[1];* ft = f[1];打破;}

d=(pow(a[0],2)-pow(a[2],2))*(a[0]-a[1])-(pow(a[0],2)-pow(a[1],2))*(a[0]-a[2]);

if(fabs(d)= = 0)break;

c =((f[0]-f[2])*(a[0]-a[1])-(f[0]-f[1])*(a[0]-a[2])/d;

if(fabs(c)= = 0)break;

b=((f[0]-f[1])-c*(pow(a[0],2)-pow(a[1],2))/(a[0]-a[1]);

aa =-b/(2 * c);

*ft=func(xk,aa,s);

if(fabs(aa-a[1])= ad){ if(* ftf[1])aa = a[1];打破;}

if(aaa[1])

{

if(* ftf[1]){ a[2]= aa;f[2]= * ft;}

else if(* ftf[1]){ a[0]= a[1];a[1]= aa;f[0]= f[1];f[1]= * ft;}

else if(*ft==f[1])

{

a[2]= aa;a[0]= a[1];

f[2]= * ft;f[0]= f[1];

a[1]=(a[0]a[2])/2;

f[1]=func(xk,a[1],s);

}

}

其他

{

if(* ftf[1]){ a[0]= aa;f[0]= * ft;}

else if(* ftf[1]){ a[2]= a[1];a[1]= aa;f[2]= f[1];f[1]= * ft;}

else if(*ft==f[1])

{ a[0]= aa;a[2]= a[1];

f[0]= * ft;f[2]= f[1];

a[1]=(a[0]a[2])/2;

f[1]=func(xk,a[1],s);

}

}

}

if(* ftf[1]){ * ft = f[1];aa = a[1];}

回aa;

}

双*渐变(双*xk)

{

double *g,f1,f2,q;

int I;

g =(double *)malloc(n * sizeof(double));

f1 = fny(xk);

for(I = 0;在;我)

{ q = ff

xk[I]= xk[I]q;F2 = fny(xk);

g[I]=(Ff1)/q;xk[I]= xk[I]-q;

}

返回g;

}

双* bfgs(双*xk)

{

double u[n],v[n],h[n][n],dx[n],dg[n],s[n];

双aa,IB;

double *ft,*xk1,*g1,*g2,*xx,* x0 = xk

双fi;

int i,j,k;

ft =(double *)malloc(sizeof(double));

xk1 =(double *)malloc(n * sizeof(double));

for(I = 0;在;我)

{

s[I]= 0;

for(j = 0;jn;j)

{

h[I][j]= 0;

if(j = = I)h[I][j]= 1;

}

}

g1 =梯度(xk);

fi = fny(xk);

x0 = xk

for(k = 0;kn;k)

{

IB = 0;

if(ia = = 1){ xx = xk;打破;}

IB = 0;

for(I = 0;在;I)s[I]= 0;

for(I = 0;在;我)

for(j = 0;jn;j)

s[I]=-h[I][j]* G1[j];

aa =拉格朗日(xk,ft,s);

xk1=iterate(xk,aa,s);

g2 =梯度(xk1);

for(I = 0;在;我)

if((fabs(G2[I])= AC)(fabs(G2[I]-G1[I))= AC)

{ IB = IB 1;}

if(IB = = 0){ xx = xk1;打破;}

fi = * ft

如果(k==n-1)

{ int j;

xk = xk1

for(I = 0;在;我)

for(j = 0;jn;j)

{

h[I][j]= 0;

if(j = = I)h[I][j]= 1;

}

g1 = g2k =-1;

}

其他

{

int j;

double a1=0,a2 = 0;

for(I = 0;在;我)

{

DG[I]= G2[I]-G1[I];

dx[I]= xk1[I]-xk[I];

}

for(I = 0;在;我)

{

int j;

u[I]= 0;v[I]= 0;

for(j = 0;jn;j)

{

u[I]= u[I]DG[j]* h[j][I];

v[I]= v[I]DG[j]* h[I][j];

}

}

for(j = 0;jn;j)

{

a1 = dx[j]* DG[j];

a2 = v[j]* DG[j];

}

if(fabs(a1)!=0)

{

a2 = 1 a2/a1;

for(I = 0;在;我)

for(j = 0;jn;j)

h[I][j]=(a2 * dx[I]* dx[j]-v[I]* dx[j]-dx[I]* u[j])/a1;

}

xk = xk1g1 = g2

}

}

if(* ftfi){ * ft = fi;xx = xk}

xk = x0

返回xx;

}

void main()

{

int k;

double *xx,f;

double xk[n]={1,1 };

xx = bfgs(xk);

f = fny(xx);

printf(" \ n \ n最佳设计结果是:\ n ");

for(k = 0;kn;k)

{printf("\n\tx[%d]*=%f ",k 1,xx[k]);}

printf("\n\tf*=%f ",f);

getch();

}

这是基于一本书中的算法。但是我很奇怪,原著里的算法有结果列出来,我却编不出来。真是奇迹!修改后就可以得到结果了。如果想用这个简单的程序,只需要改变维数n,double fny(double *x)的实现部分,以及主函数中xk的初始值。但是这个节目也不是很好。

C语言中关于渐变的介绍就讲到这里吧。感谢您花时间阅读本网站的内容。别忘了搜索更多关于矩阵函数中的梯度和C语言中的梯度的信息。

相关文章

发表新评论