题目:

      已知 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 floatTYPE 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);elsevectoreEqual(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.法可适用于多维搜索。

      经多次修改,此程序具有较好的复用性,主要体现在两个方面,一是只需根据具体题目,对本程序的三处代码稍加修改,即可复用;二是只需少量修改,便可将本最速下降法改写成共轭梯度法或牛顿法,具体操作,可参考我的用共轭梯度法球最优解和用牛顿法求最优解的两篇博文。

      经编程验证,此方法无误。

用最速下降法求最优解相关推荐

  1. 最优解matlab机械大作业,最速下降法求最优解西安电子科技大学matlab结课大作业...

    07112016.最速下降法求最优解 六. 结果评价 本次测试分别从两组不同的初始搜索位置,两组不同 a,b,c,d 值出发, 两两比较可得结论:测试用例 abcd 为某些特定值时,不同初始搜索位置可 ...

  2. python求最值_用Python实现最速下降法求极值的方法

    对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...

  3. python迭代法求极值_用Python实现最速下降法求极值的方法

    对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...

  4. 用Python实现最速下降法求极值

    原文:https://blog.csdn.net/u012705410/article/details/47254437 用Python实现最速下降法求极值 对于一个多元函数f(x)=f(x1,x2, ...

  5. 为什么一些机器学习模型需要对数据进行归一化?——1)归一化后加快了梯度下降求最优解的速度;2)归一化有可能提高精度...

    为什么一些机器学习模型需要对数据进行归一化? http://www.cnblogs.com/LBSer/p/4440590.html 机器学习模型被互联网行业广泛应用,如排序(参见:排序学习实践).推 ...

  6. 【运筹学】对偶理论 : 互补松弛定理应用 2 ( 互补松弛定理求最优解思路 ) ★★

    文章目录 一.原问题与对偶问题标准形式 二.互补松弛定理 三.已知原问题最优解求对偶问题最优解 四.互补松弛定理求最优解思路 一.原问题与对偶问题标准形式 原问题 P\rm PP : maxZ=CXs ...

  7. 图解法求最优解的例题_简单的线性规划求最优解

    教你如何做出最佳选择 --简单的线性规划求最优解 在线性约束条件下,求线性目标函数最值问题,称为"线性规划".目标函 数 ) , ( y x f z  取得最值时,变量 y x ...

  8. 利用机器学习拟合复杂函数,并利用遗传算法求最优解

    利用机器学习拟合复杂函数,并利用遗传算法求最优解 编程语言:Python 利用工具:sklearn.keras.geatpy 步骤原理简述: 1.利用机器学习到数据集的多维特征和输出的拟合函数关系(模 ...

  9. matlab 二分法求最优解

    MATLAB二分法求最优解 [菜狗bb]emm-原理挺简单的,应该没啥不明白的.就是给一个函数f以及区间[a,b]和精确度esp,对区间的中间值进行求导,小于0就把中间值赋给a,大于0就把中间值赋给b ...

最新文章

  1. PCL点云特征描述与提取(4)
  2. Building High Performance Websites (1) CDN
  3. 安装完CentOS可以不做的事
  4. 推荐特征筛选偷懒神器-M3USelector
  5. 贵州师范学院计算机2级报名,贵州省2021年上半年计算机二级报名时间
  6. Spring Boot快速搭建入门程序
  7. WxWidgets :一些古怪的源代码
  8. [nginx报错]---unknown directive chunkin in /XXXXX/XXXXXX:XX的几种解决方式
  9. dijkstra标号法表格_标号法求最短路径例题详解.ppt
  10. 今晚直播丨Oracle数据库SQL执行计划的取得和解析
  11. Python基础1(2017-07-16)
  12. 词频统计——三国人物出场次数统计
  13. springboot整合dubbo注解方式(三)
  14. 【基础教程】关于matlab GUI重命名的问题【739期】
  15. ios开发 服务器通信协议,iOS开发之网络协议TCP/IP、HTTP
  16. 如果你有想珍惜的人,一定要送TA这个礼物!绝美又有内涵
  17. Navicat出现超出试用期无法打开的解决办法,亲测有效!
  18. Android jni curl返回CURLE_COULDNT_RESOLVE_HOST问题
  19. HDLBits-Lemmings4
  20. 吉隆坡Mac高清动态壁纸

热门文章

  1. HashMap与HashSet
  2. vue 中监听document.body.scrollTop 值总为0的解决方法
  3. js input 正则保留2位小数中文拼音输入问题 + 限制输入整数的方案
  4. 布莱克斯科尔斯模型(二)之e^(-βt^2)的傅里叶变换
  5. GameJam线下48小时极限游戏开发体验
  6. android 陀螺仪源码,陀螺仪源码 android
  7. Labview LabSQL下载
  8. VUE activated,deactivated使用
  9. pscp使用详解 Win与Linux文件互传工具
  10. 敏涵控股集团董事长刘敏:感恩奉献 一路向前