题目:
已知 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.法可适用于多维搜索。
经多次修改,此程序具有较好的复用性,主要体现在两个方面,一是只需根据具体题目,对本程序的三处代码稍加修改,即可复用;二是只需少量修改,便可将本最速下降法改写成共轭梯度法或牛顿法,具体操作,可参考我的用共轭梯度法球最优解和用牛顿法求最优解的两篇博文。
经编程验证,此方法无误。
分享到:
相关推荐
需要注意的是,最速下降法可能会遇到局部最优解,尤其是在非凸函数中。为了避免陷入局部最优,可以尝试不同的初始点或者使用更高级的优化算法,如共轭梯度法、拟牛顿法或有限内存的BFGS方法。 总之,最速下降法是...
最速下降法原理及其算法实现课程论文 摘要:本论文主要讨论了最速下降法原理及其算法实现,在解决无约束非线性规划问题中扮演着重要角色。论文通过数学分析和运筹学书籍的研究,结合作者在学习中掌握的知识,并在...
"最速下降法求最优解" 最速下降法是梯度法的一种,即梯度下降法,是一种重要的无约束最优化方法。该法将 n 维问题转化为一系列不断迭代过程中沿负梯度方向用一维搜索方法寻优的问题。通过最速下降法,可以有效地...
首先,由于每次只沿梯度的负方向移动一小步,可能需要很多次迭代才能达到最优解,导致收敛速度较慢。其次,学习率的选择很关键,固定的学习率可能导致不稳定,而自适应调整学习率则需要额外的计算成本。最后,如果...
1. **第一步:最速下降法** – 在较大范围内使用最速下降法来快速逼近最优解区域,避免陷入局部最优。 2. **第二步:牛顿法** – 当最速下降法找到一个相对较好的初始点后,改用牛顿法进行优化,以加速收敛至全局最...
3. **判断终止条件**:如果梯度的模长小于允许误差,则停止迭代,返回当前点作为近似最优解。 4. **确定搜索方向**:搜索方向为梯度的负方向,即\( -\nabla f(\mathbf{x}_k) \)。 5. **线搜索**:使用某种线搜索方法...
在实际应用中,为了选择合适的优化算法,需要考虑以下因素:函数的复杂性、计算资源、收敛速度需求以及对全局最优解的追求。对于复杂的多变量问题,可能会结合全局优化策略,如遗传算法或模拟退火算法,与局部优化...
该方法利用了目标函数在某一点处梯度的方向来寻找函数值减少最快的方向,从而逐步逼近最优解。本文将详细介绍最速下降法的基本原理及其背后的数学理论。 #### 二、梯度向量的概念 在了解最速下降法之前,我们首先...
最速下降法求解线性代数方程组 最速下降法是一种常用的优化算法,用于求解线性代数方程组。该算法的主要思想是沿着目标函数的负梯度方向搜索,以达到目标函数...使用最速下降法可以快速求解线性代数方程组 Ax=b 的解。
- 判断停止条件,并返回最优解和最小函数值 在实际应用中,最速下降法的一个主要缺点是可能会在局部最小值附近震荡,尤其是当函数具有多峰或者梯度较平坦的区域时。为了克服这个问题,人们发展出了许多改进版的优化...
在本案例中,"基于黄金分割法一维搜索的最速下降法"是将两者结合,用黄金分割算法来确定最速下降法中的步长。这样的结合可以改善最速下降法的步长选取问题,使得算法在收敛速度和全局寻优性能上有所提升。具体实现...
然而,最速下降法的一个主要缺点是它可能导致“锯齿”路径,即在接近最优解时效率低下,表现为在最小值的等值线附近来回摆动。这主要是因为最速下降法只考虑了当前点的梯度信息,而没有利用之前的搜索历史,导致它在...
- **收敛速度慢**:最速下降法通常需要许多次迭代才能接近最优解,特别是当函数的梯度接近水平时,步长可能会变得非常小,导致迭代过程缓慢。 - **依赖学习率**:选择合适的学习率αk至关重要。如果太大,可能会跳过...
这些定理为设计最速下降法等优化算法提供了理论基础。 ##### (二)最速下降法的基本思想和迭代步骤 最速下降法的基本思想是从当前点出发,在该点找到函数下降最快的方向,并沿着这个方向移动一定的距离以期望达到一...
最速下降法是一种用于求解无约束优化问题的有效算法。它通过沿着目标函数在当前点处梯度的负方向进行迭代搜索来逐步逼近最优解。这种方法适用于解决多元函数最小化问题,在机器学习、数据挖掘等领域有广泛应用。 ##...
程序流程图是描述算法执行步骤的一种图形化方式,对于最速下降法而言,其程序流程图主要包括初始化、计算梯度、确定搜索方向、一维搜索、更新位置以及判断终止条件等步骤。 #### 例题 为了更好地理解最速下降法的...
从给出的结果来看,经过5次迭代后,算法找到了一个接近最优解的点 `(0.002412, -0.000004)`,对应的函数值为 `0.000006`,误差为 `0.004828`,满足了停止条件。 总结来说,这个MATLAB代码演示了如何用最速下降法...
阐述了最速下降算法求非线性方程组最优解的原理;提出在距离测量误差较大的情况下,使用最速下降算法优化极大似然估计算法所得的节点定位值,并通过模拟实验证实其可行性。实验结果表明,在无须多余通信代价的条件下...
最优化算法是解决实际问题中寻求最优解的重要工具,它广泛应用于工程、经济、科学计算等领域。本主题聚焦于一种经典的最优化方法——最速下降法,并通过MATLAB这一强大的数学计算软件进行仿真。MATLAB以其丰富的函数...