渐变的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语言中的梯度的信息。
最后更新于 2023-09-04 07:31:45 并被添加「C语言 渐变 」标签,已有 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章