#include <stdio.h>
#include <math.h>
int main(void)
{
double f; // 函数因变量
double x1 = 2.0, x2 = 2.0; // 自变量
double df1, df2; // 梯度
double df11, df12, df21, df22; // 黑塞矩阵
int k = 1; // 迭代次数
double d1, d2; // 搜索方向
double a;
double b;
double temp_df1, temp_df2;
// f(x)= x1^2 + x2^2
f = pow(x1, 2) + pow(x2, 2);
// f(x)的梯度
df1 = 4 * x1;
df2 = 2 * x2;
df11 = 4;
df12 = 0;
df21 = 0;
df22 = 2;
// 如果范数等于0,迭代终止
while (sqrt(pow(df1, 2) + pow(df2, 2)) > 0.00001)
{
temp_df1 = df1;
temp_df2 = df2;
if (k == 1)
{
d1 = -df1;
d2 = -df2;
a = -(df1 * d1 + df2 * d2) / (d1 * df11 * d1 + d2 * df22 * d2);
x1 = x1 + a * d1;
x2 = x2 + a * d2;
k = k + 1;
}
else
{
df1 = 4 * x1;
df2 = 2 * x2;
b = (pow(df1, 2) + pow(df2, 2)) / (pow(temp_df1, 2) + pow(temp_df2, 2));
d1 = -df1 + b * (-temp_df1);
d2 = -df2 + b * (-temp_df2);
a = -(df1 * d1 + df2 * d2) / (d1 * df11 * d1 + d2 * df22 * d2);
x1 = x1 + a * d1;
x2 = x2 + a * d2;
k = k + 1;
}
}
printf("x1 = %f,x2 = %f\n", x1, x2);
printf("迭代次数:%d\n", k);
return 0;
}
最优化:共轭梯度法C代码
于 2024-01-07 16:41:36 首次发布