`

用牛顿法求最优解

阅读更多

题目:

      已知 f(x) = (x1-1)2+5(x2-5)2+(x3-1)2+5(x4-5)  用快速下降法、牛顿法或共轭梯度法求 minf(x) 

 

牛顿法代码:

 

//牛顿法
//请根据具体题目,修改本程序“//@”所在行的下一行代码。
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
//@ 题目中方程是几元的,此处将LEN设为几
#define LEN 4
#define TYPE float

TYPE fAnswer(TYPE *x) {    //求f(x)的值,并返回
	TYPE f;
	//@ 题目中的方程写与此
	f = (x[0] - 1) * (x[0] - 1) + 5 * (x[1] - 5) * (x[1] - 5) + (x[2] - 1) * (x[2] - 1) + 5 * (x[3] - 5) * (x[3] - 5);
	return f;
}

void vectorMultiply(TYPE *x, TYPE e) {    //常数e乘x向量,赋值给x向量 【若求负梯度,可用梯度乘-1】
	int i;
	for(i = 0; i < LEN; i++) {
		x[i] = e * x[i];
	}
}

void vectorAdd(TYPE *x, TYPE *y, TYPE *z) {    //向量加法操作
	int i;
	for(i = 0; i < LEN; i++) {
		z[i] = x[i] + y[i];
	}
}

void vectorSub(TYPE *x, TYPE *y, TYPE *z) {    //向量减法操作
	int i;
	for(i = 0; i < LEN; i++) {
		z[i] = x[i] - y[i];
	}
}

void vectoreEqual(TYPE *x, TYPE *y) {    //向量赋值操作
	int i;
	for(i = 0; i < LEN; i++) {
		y[i] = x[i];
	}
}

TYPE norm2_graded(TYPE *x) {    //负梯度模的平方
	int i;
	TYPE norm2 = 0.0;

	for(i = 0; i < LEN; i++) {
		norm2 += x[i] * x[i];
	}

	return norm2;
}

//@ 对题目的xi分别求偏倒,赋值给stepLength[i]
void setStepLength(TYPE *stepLength, TYPE *x0) {
	stepLength[0] = 1 - x0[0];
    stepLength[1] = 5 - x0[1];
	stepLength[2] = 1 - x0[2];
    stepLength[3] = 5 - x0[3];
}

void DSC(TYPE *x0, TYPE *stepLength) {    //用D.S.C.法求下一个x落点
	TYPE x1[LEN];
	TYPE x2[LEN];
	TYPE x3[LEN];
	TYPE x4[LEN];
	TYPE x5[LEN];
	TYPE xa[LEN];
	TYPE xb[LEN];
	TYPE xc[LEN];
	vectorAdd(x0, stepLength, x1);
	if(fAnswer(x1) > fAnswer(x0))
		vectorMultiply(stepLength, -1);

	vectorAdd(x0, stepLength, x1);
	while(fAnswer(x1) <= fAnswer(x0)) {
		vectoreEqual(x1, x0);
		vectorAdd(stepLength, stepLength, stepLength);
		vectorAdd(x1, stepLength, x1);
	}

	vectorMultiply(stepLength, 0.5);
	vectorSub(x0, stepLength, x2);
	vectoreEqual(x1, x4);
	vectoreEqual(x0, x3);
	vectorSub(x1, stepLength, x5);

	if(fAnswer(x5) > fAnswer(x3))
		vectoreEqual(x3, xb);
	else
		vectoreEqual(x5, xb);

	vectorSub(xb, stepLength, xa);
	vectorAdd(xb, stepLength, xc);

	vectorMultiply(stepLength, (fAnswer(xa) - fAnswer(xc)) / (2 * (fAnswer(xa) - 2 * fAnswer(xb) + fAnswer(xc))));
	vectorAdd(xb, stepLength, x0);
}

void main() {    //方法主体
	TYPE x0[LEN];    //初始点
	TYPE stepLength[LEN];    //步长
	TYPE e = 0.001;    //误差

	int i;    //用于循环计数
	
	printf("请输入x的初始值:\n");
	for(i = 0; i < LEN; i++) {    //初始化x0数组
		printf("x%d = ", i+1);
		scanf("%f", &x0[i]);
	}

	setStepLength(stepLength, x0);

    i = 1;
	while(norm2_graded(stepLength) > e * e) {    //牛顿法主体
		DSC(x0, stepLength);
		setStepLength(stepLength, x0);
		i = i + 1;
	}
	printf("最速下降法循环结束,共循环%d次\n", i - 1);

	printf("使用牛顿法获得的最优点为:\n");
	for(i = 0; i < LEN; i++) {
		printf("x%d = %f\n", i+1, x0[i]);
	}
printf("minf(x) = %f\n", fAnswer(x0));

	printf("牛顿法程序结束!!!\n");

}

 

总结

        本解法所使用的一维搜索算法仍是改进的D.S.C.法,将步长 的初始值改为负梯度向量,D.S.C.算法中的其它一维参量也采用向量形式替换,使此D.S.C.法可适用于多维搜索。

        本解法仅通过将我发表的最速下降法中的setStepLength(TYPE *stepLength, TYPE *x0)函数中各分量的系数去掉而得到。

        经测试验证,此方法无误。

分享到:
评论

相关推荐

    最优化-牛顿法求最优解matlab程序

    最优化-牛顿法求最优解matlab程序,例子对应于电子科技大学最优化课程中的一个例题,用matlab程序实现牛顿法计算一个优化问题。

    牛顿法最优解 MATLAB程序

    利用牛顿法求解目标函数最优解,目标函数、初始点、允许误差可以根据自己需要修改,进行测试

    牛顿法最优解

    matlab编程,利用牛顿迭代法寻找最优解,供学习参考,

    牛顿法例题详解.docx

    牛顿法是一种数值最优化算法,它通过迭代的方式寻找函数的局部极小值。这个方法基于牛顿-拉弗森迭代公式,适用于多元函数的优化问题。在标题为"牛顿法例题详解.docx"的文档中,我们可以通过一个具体的例子来深入理解...

    牛顿法寻找方程最优解VBS代码surface rt可用 最优化大作业

    用surface rt写的牛顿法找最优解,原本是做最优化的大作业用的。

    Newton_localvyg_newton_牛顿法求最优解_Matlab代码_

    本资源包含了一个使用Matlab实现的牛顿法求最优解的程序,用户可以根据自己的需求修改目标函数。 牛顿法的基本步骤如下: 1. **初始化**: 首先,选择一个初始点x0作为迭代的起点。 2. **一阶导数和二阶导数**: ...

    牛顿法寻优

    在线性寻优算法中,牛顿法是最常用的算法之一,本程序是利用牛顿法寻找最优解Matlab代码。

    阻尼牛顿法求函数最小值matlab代码.docx

    如果行列式为零,表示Hessian矩阵不可逆,可能存在鞍点或平坦区域,这时算法无法提供有效的下降方向,因此我们输出"无最优解"并结束循环。 接着,我们进行阻尼牛顿法的核心步骤,计算下降步长`s`,并利用牛顿法更新...

    matlab最速下降法与牛顿法结合求解函数最大值,还能动画演示求解点的运动过程

    2. **第二步:牛顿法** – 当最速下降法找到一个相对较好的初始点后,改用牛顿法进行优化,以加速收敛至全局最优解。 3. **动画演示** – 在整个过程中,通过MATLAB绘制三维图形并动态显示迭代点的变化情况,便于...

    近代优化方法利用C++编写的黄金分割点法求最优解的程序

    6. **返回结果**:返回当前最小值点 `c` 作为近似最优解。 C++程序中,可能使用了结构体或类来封装这个算法,包含初始化、计算、更新和终止的成员函数。同时,为了处理实际问题,程序可能还需要包含输入输出功能,...

    最优化 拟牛顿法,高斯-牛顿法,LM法,共轭梯度法

    通过反复迭代,算法会逐渐接近最优解。这些算法的性能和适用性取决于问题的特性,例如函数的平滑性、目标函数的形状以及初始猜测值的选择。 理解并熟练运用这些优化算法对于解决实际问题至关重要,因为它们广泛应用...

    牛顿法解优化问题_拟牛顿法_牛顿法优化_牛顿_牛顿法_lightgnc_

    总的来说,牛顿法及其变种是优化问题的核心工具,它们通过迭代和近似策略来逐步逼近最优解。拟牛顿法通过减少对海森矩阵的直接操作,提高了计算效率,而阻尼牛顿法则通过调整步长来增强算法的稳定性。在"lightgnc...

    牛顿法,阻尼牛顿法和改进的阻尼牛顿法的matlab实现

    "改进的阻尼牛顿法"可能是对阻尼牛顿法的一种优化策略,可能包括动态调整阻尼因子、使用拟牛顿法的近似海森矩阵或者结合其他优化技术,如线搜索方法,以提高算法的收敛速度和全局寻优性能。在实际应用中,这类改进...

    matlab对牛顿任意一维数据多项式处理求最优解迭代方法

    matlab对牛顿任意一维数据多项式处理求最优解迭代方法,包括一维近似点的搜索迭代,满足到允许的条件,以及必要的收敛精度条件要求

    牛顿法和拟牛顿法(python源代码)

    print(res.x) # 输出最优解 ``` 在提供的“拟牛顿法”文件中,可能包含了使用Python实现的BFGS或DFP算法的示例代码,这些代码可以帮助初学者理解并掌握拟牛顿法的实现过程。通过阅读和运行这些代码,你可以加深对这...

    阻尼牛顿法求函数极小值

    对于复杂的非线性问题,直接求解通常不可行,因此需要借助数值方法来逼近最优解。牛顿法是一种广泛使用的二阶优化算法,它利用目标函数的一阶导数(梯度)和二阶导数(海森矩阵)的信息来快速收敛到极小值点。然而,...

    最优化牛顿法matlab

    最终,当迭代结束时,`xmin`存储了找到的最优解,`n`记录了实际的迭代次数,而`F(x1(1),x1(2))`给出了在最优解处的函数值。 需要注意的是,牛顿法对初始解的选择很敏感,不同的初始解可能导致找到不同的局部极小值...

    优化设计课件 优化设计的最优解及获得最优解的条件

    以下是对"优化设计课件 优化设计的最优解及获得最优解的条件"的详细解析。 首先,优化设计的数学模型是解决问题的基础。它由目标函数和约束条件两部分组成。目标函数定义了我们想要最小化或最大化的目标,如质量...

    秩1拟牛顿法解非线性方程组.zip

    - 如果目标函数有多个局部最小值,拟牛顿法可能只找到一个局部解,而非全局最优解。为获取全局解,可能需要多次运行算法,每次从不同的初始点开始。 总之,秩1拟牛顿法在Matlab中的实现为解决非线性方程组提供了一...

    Matlab拟牛顿法以及实例

    6. **迭代过程分析**:可观察每次迭代的目标函数值变化和步长选择,以理解算法如何逐步逼近最优解。 拟牛顿法在实际应用中非常强大,尤其对于高维问题,其效率往往优于梯度下降法。通过学习和理解Matlab中的拟牛顿...

Global site tag (gtag.js) - Google Analytics