コード例 #1
0
        public static void BottomUpAutoDiffTest()
        {
            var x = new BottomUpAutoDiff(Math.PI / 4, 1.0);
            var y = BottomUpAutoDiff.sin(x);

            // sin(x)の微分
            //x.setValue(Math.PI / 4);
            //x.select();
            //y = Math.Sin(x);
            Console.WriteLine(2 * y.getdVal());

            var x2 = new BottomUpAutoDiff(5.0, 1.0);
            var y2 = new BottomUpAutoDiff(1.0, 1.0);

            //x = 5.0;
            //y = 0.0;
            //x.select();
            for (int i = 0; i < 10; ++i)
            {
                y2 = y2 + x2 * x2;
            }
            // x = 5.0のときのyとdy/dxを出力
            Console.WriteLine("{0}, {1}", y2.getValue(), y2.getdVal());

            // ニュートン法の実行
            var x3 = new BottomUpAutoDiff(2.0, 1.0);
            var y3 = new BottomUpAutoDiff(0.0, 1.0);

            //x = 2.0; // 適当な初期値
            for (int i = 0; i < 10000; ++i)
            {
                // y = (x-sqrt(2))*(x^2+x+1)
                y3.setValue((x3.getValue() - Math.Sqrt(2.0)));// *
                //(x3.getValue() * x3.getValue() + x3.getValue() + 1));
                // yの値がdoubleの丸め誤差と同程度に小さければ終了
                if (y3.getValue() < 1e-15)
                {
                    break;
                }
                // ニュートン法の更新式で次のxを求める
                x3.setValue(x3.getValue() - y3.getValue() / y3.getdVal());
            }
            // x(=sqrt(2))を出力
            Console.WriteLine(x3.getValue());
        }
コード例 #2
0
 public static BottomUpAutoDiff exp(BottomUpAutoDiff x)
 {
     return(new BottomUpAutoDiff(Math.Exp(x.val), x.dVal * Math.Exp(x.val)));
 }
コード例 #3
0
 public static BottomUpAutoDiff sqrt(BottomUpAutoDiff x)
 {
     return(new BottomUpAutoDiff(Math.Sqrt(x.val), 0.5 * x.dVal / Math.Sqrt(x.val)));
 }
コード例 #4
0
 public static BottomUpAutoDiff cos(BottomUpAutoDiff x)
 {
     return(new BottomUpAutoDiff(Math.Cos(x.val), -Math.Sin(x.val)));
 }
コード例 #5
0
 public static BottomUpAutoDiff log(BottomUpAutoDiff x)
 {
     return(new BottomUpAutoDiff(Math.Log(x.val), x.dVal / x.val));
 }