c++ - 为什么我总是得到 Nan 作为输出?

标签 c++ math

我正在尝试用 C++ 编写一个简单的梯度下降算法(迭代 10,000 次)。这是我的程序:

#include<iostream>
#include<cmath>

using namespace std;

int main(){

  double learnrate=10; 
  double x=10.0; //initial start value

  for(int h=1; h<=10000; h++){
     x=x-learnrate*(2*x + 100*cos(100*x));
  }

  cout<<"The minimum is at y = "<<x*x + sin(100*x)<<" and at x = "<<x;

  return 0;
}

输出最终为:y=nan 和 x=nan。我尝试通过将 x 和 y 的值放入文件中来查看它们,经过一定数量的迭代后,我得到了所有 nans(对于 x 和 y)。编辑:我选择学习率(或步长)为 10 作为实验,之后我将使用更小的值。

最佳答案

一定是你的公式有问题。 x 的前 10 个值已经像 hell 一样增加:

-752.379
15290.7
-290852
5.52555e+06
-1.04984e+08
1.9947e+09
-3.78994e+10
7.20088e+11
-1.36817e+13
2.59952e+14

无论您选择什么起始值,下一个x 的绝对值都会更大。

|next_x| = | x - 20 * x - 100 * cos(100*x) |

例如,考虑当您选择一个非常小的起始值 (|x|->0) 时会发生什么,然后

|next_x| = | 0 - 20 * 0 - 100 * cos ( 0 ) | = 100

关于c++ - 为什么我总是得到 Nan 作为输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46496271/

相关文章:

c++ - 当函数已知时的傅立叶变换

c++ - 如何在注册表中注册一个类?

java - 困难的公式

c - fork 的可能组合数

java - 将文本数学方程式转换为数字和符号

c++ - std::array 求最大值函数

c++ - char *blah = "hello"是如何工作的?

c++ - QSystemtrayicon : no image on Mac

python - 为什么我的 Project Euler #12 代码这么慢?

javascript - Tic-Tac_Toe 计算机算法