一、原理
二、示例
以 为例
梯度(导数):
步长:
迭代公式:
第0次迭代:令x = 2
第1次迭代: = 2 - 0.1 * (4 * 2) = 1.2
第2次迭代: = 1.2 - 0.1 * (4 * 1.2) = 0.72
依次类推
三、代码
/*********
求解方程:
f(x) = 2x^2 + 1
梯度:
∇f(x) = 4*x
--->
迭代公式:
x_(k+1) = x_(k) - a * ∇f(x_(k));
*/
#include <stdio.h>
#include <stdlib.h>
bool gd(const float x, float& next_x) {
const float a = 0.1;
const float e = 0.001;
float df = 4*x;
if(df <= e) {
return false;
}
next_x = x - a * df;
return true;
}
int main() {
float x = 2.0;
printf("迭代次数:0: x=%f\n", x);
int iteration = 500;
while (iteration-- > 0) {
if(!gd(x, x)) {
break;
}
printf("迭代次数:%d: x=%f\n", 500 - iteration, x);
}
printf("最终结果: x=%f\n", x);
return 0;
}
输出结果:
迭代次数:0: x=2.000000
迭代次数:1: x=1.200000
迭代次数:2: x=0.720000
迭代次数:3: x=0.432000
迭代次数:4: x=0.259200
迭代次数:5: x=0.155520
迭代次数:6: x=0.093312
迭代次数:7: x=0.055987
迭代次数:8: x=0.033592
迭代次数:9: x=0.020155
迭代次数:10: x=0.012093
迭代次数:11: x=0.007256
迭代次数:12: x=0.004354
迭代次数:13: x=0.002612
迭代次数:14: x=0.001567
迭代次数:15: x=0.000940
迭代次数:16: x=0.000564
迭代次数:17: x=0.000339
迭代次数:18: x=0.000203
最终结果: x=0.000203