📄 tidofa.c
字号:
#include <stdio.h>
double f(double g, double h)
{
return (2.0*g*g +2.0*h*h -2.0*g*h -4.0*g -6.0*h);
}
double fx(double g, double h)
{
return (2.0*g - 2.0*h - 4);
}
double fy(double g, double h)
{
return (-2.0*g + 2.0*h - 6);
}
//double fz(double g, double h,double i)
/*
*/
double lineSearch(double XK[2],double dk[2],double max)
{
double x[100];
//double y[100];
//double z[100];
int i=0;
double p;//=0.01;//步长
if(max<0.0)
p = 0.01;
else if (max >1.0)
p = 0.01;
else
p = max * 0.001;
//初始值
x[0] = 0;
//y[0] = 0;
//z[0] = z0;
for(i=0;i<99;i++)//迭代100次
{
//x[i + 1] = x[i] - p * fx(x[i], y[i]);
//y[i + 1] = y[i] - p * fy(x[i], y[i]);
//z[i + 1] = z[i] - p * fz(x[i], y[i],z[i]);
x[i+1] = x[i] - p * ( fx(XK[0]+x[i]*dk[0],XK[1]+x[i]*dk[1])*dk[0]+ fy(XK[0]+x[i]*dk[0],XK[1]+x[i]*dk[1])*dk[1]);
if(max >0.0)
{
if(x[i+1] > max)
{
if(f(XK[0]+x[i]*dk[0],XK[1]+x[i]*dk[1]) < f(XK[0]+max*dk[0],XK[1]+max*dk[1]))
x[99] = x[i];
else
x[99] = max;
break;
}
}
}
//printf("%f,%f,%f",x[99],y[99],f(x[99],y[99]));
printf("lamata:%f,min(f(XK+lamata*dk)):%f",x[99],f(XK[0]+x[99]*dk[0],XK[1]+x[99]*dk[1]));
return f(XK[0]+x[99]*dk[0],XK[1]+x[99]*dk[1]);
}
/*
void main()
{
double XK[2]={1.0,-1.0};double dk[2]={1.0,1.0};double max =5.0;
lineSearch(XK, dk, max);
return;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -