题目:
已知 f(x) = (x1-1)2+5(x2-5)2+(x3-1)2+5(x4-5)2 ,用快速下降法、牛顿法或共轭梯度法求 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;
}
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);
}
//@ 对题目的xi分别求偏倒,赋值给stepLength[i]
void setStepLength(TYPE *stepLength, TYPE *x0) {
stepLength[0] = 2 * (1 - x0[0]);
stepLength[1] = 10 * (5 - x0[1]);
stepLength[2] = 2 * (1 - x0[2]);
stepLength[3] = 10 * (5 - x0[3]);
}
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.法可适用于多维搜索。
经多次修改,此程序具有较好的复用性,主要体现在两个方面,一是只需根据具体题目,对本程序的三处代码稍加修改,即可复用;二是只需少量修改,便可将本最速下降法改写成共轭梯度法或牛顿法,具体操作,可参考我的用共轭梯度法球最优解和用牛顿法求最优解的两篇博文。
经编程验证,此方法无误。
分享到:
相关推荐
再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也...
最速下降法求最优解西安电子科技大学matlab结课大作业.doc
阐述了最速下降算法求非线性方程组最优解的原理;提出在距离测量误差较大的情况下,使用最速下降算法优化极大似然估计算法所得的节点定位值,并通过模拟实验证实其可行性。实验结果表明,在无须多余通信代价的条件下...
简单解释:比如拿温度传感器来说,就是根据之前一段时间的温度数据计算下当前理论上应该测量到的温度,如果超出这个最优解的一定比例,就可以理解为突发状况了
最速下降迭代法又叫梯度下降迭代法,是从一已知点出发,依照某种规则,求出相继点,取代原先的点,然后重复以上过程,得到点序列,以使其趋于最优解的迭代方法
机械优化设计作业(牛顿法) 说明:学完优化设计,老师说要...功能有:输入起始点(x0,x1)和精度E 求出最优解。运算过程保存在程序目录的 txt文件中。txt自动添加标题。添加程序运行时间。等等等~ 大家可以借鉴一下
利用最速下降法可以求得非线性方程的最优解,运算过程简单易懂。
最速下降法,沿梯度下降的方法寻找最优解的经典方法
用于以最速下降法求解最值,可应用在机械优化设计最优解的求取
使用梯度下降法求无约束问题最优解,包括最速下降法,常数步长下降法等。
一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法...
梯度下降法在学习、⽣活、科研以及⼯程应⽤中,⼈们经常要求解...梯度下降法就是这样的⼀种算法,在⼀步⼀步逼近的过程中,⽬标函数值呈下降趋势,输⼊参数的值也⼀步⼀步逼近最优解,其整个 迭代逼近过程如下图所⽰:
式求解其近似最优解,采用梯度下降法最小化损失函数,在MATLAB等程序实现的基 础上进行研究。对线性回归模型、逻辑斯谛回归模型学习的梯度下降法及其变体算法 进行算例分析,通过比较算法的收敛速度与复杂度,得到了...
利用最速梯度下降法求解: 函数接口:[xstar,fxstar,iter] = SteepDescent(f_name,x0,eps) 其中xstar为最优解,fxstar为最优函数值,iter为迭代次数。 f_name为目标函数文件,可以用feval调用计算函数值及梯度; x0...
机械优化设计作业(鲍威尔) 说明:学完优化设计,老师说要...功能有:输入起始点(x0,x1)和精度E 求出最优解。运算过程保存在程序目录的 txt文件中。txt自动添加标题。添加程序运行时间。等等等~ 大家可以借鉴一下
例如,梯度下降法是一种广泛使用的优化算法,它通过计算损失函数的梯度来更新模型参数,逐步逼近最优解。 在资源分配领域,优化算法可以有效地分配有限资源,以实现成本最小化或效益最大化。在供应链管理、生产调度...
针对基本遗传算法(SGA)容易过早陷入局部最优解及其后期局部能力差的缺点,提出了一种带有局部搜索技术的混合遗传算法(HGA),将一种局部搜索技术加入到遗传算法(GA)中,这种局部搜索技术,即设定一种选择机制,有选择地...
无约束最优化方法 3.1 无约束最优化问题的最优性条件 3.2 最速下降法 3.3 Newton法 3.4 共轭方向法和共轭梯度法 3.5 拟Newton法 3.6 Powell方向加速法 习题第4章 约束最优化方法 4.1 约束最优化问题的最优性条件 4.2...
本文使用python实现了梯度下降算法,支持y = Wx+b的线性回归 目前支持批量梯度算法和随机梯度下降算法(bs=1) 也支持输入特征向量的x维度小于3的图像可视化 代码要求python版本>3.4 代码 ''' 梯度下降算法 Batch...
该问题的最优解为x* =0.精度取1e- 4,步长由非精确线搜索生 成,方向分别由下列方法生成: 。最速下降法 。阻尼牛顿法 。DFP方法 。FR方法 3 编写惩罚函数法和增广拉格朗日方法的程序求解下面的问题 】「 关于上机作业...