最优化:共轭梯度法C代码

#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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值