OSDN Git Service

New a Math.qubicsecant function
authordhrname <dhrname@users.sourceforge.jp>
Wed, 1 Apr 2015 14:31:53 +0000 (23:31 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Wed, 1 Apr 2015 14:31:53 +0000 (23:31 +0900)
org/w3c/dom/smil.js

index 5b9d204..09cdb13 100644 (file)
@@ -616,7 +616,7 @@ base("$from").of( {
            * ベジェ曲線のxの式が三次方程式であるため、その解 t から、ベジェ曲線の y を求める\r
            * なお、ニュートン法の初期値はxとする\r
            * なぜなら、xの式をみると、xが増加傾向となるスプラインモードでは、係数が負となる可能性が低いため*/\r
-          var t = _newton(Ax, Bx, Cx, -x, x);\r
+          var t = Math.qubicsecant(Ax, Bx, Cx, -x, x-0.001, x);\r
           return f(Ay*t*t*t + By*t*t + Cy*t);\r
         };\r
      } else if (this.mode === "discrete") {\r
@@ -628,6 +628,31 @@ base("$from").of( {
    }\r
 } ).to = base("$from").$to;\r
 \r
+/*割線法により、三次方程式 a0x^3 + a1x^2 + a2x + a3 の解を求める\r
+ * 引数x0, x1は初期値*/\r
+Math.qubicsecant = function(a0, a1, a2, a3, x0, x1) {\r
+  var eps = 1e-10,\r
+      y0 = a0 *x0*x0*x0 + a1 *x0*x0 + a2*x0 + a3,\r
+      y1 = a0 *x1*x1*x1 + a1 *x1*x1 + a2*x1 + a3,\r
+      x2 = x0;\r
+  if (y1 === 0) {\r
+    return x1;\r
+  }\r
+  /*限界の収束回数は100回とする*/\r
+  for (var i=0;i<100;++i) {\r
+    if ((y1 < eps) && (y1 > -eps)) {\r
+      return x1;\r
+    } else {\r
+      x2 = x1 - y1 * (x1 - x0) / (y1 - y0);\r
+      x0 = x1;\r
+      x1 = x2;\r
+      y0 = y1;\r
+      y1 = a0 *x1*x1*x1 + a1 *x1*x1 + a2*x1 + a3;\r
+    }\r
+  }\r
+  return x2;\r
+};\r
+\r
 /*ニュートン法により、三次方程式 a0x^3 + a1x^2 + a2x + a3 の解を求める\r
  * 引数bは初期値*/\r
 Math.qubicnewton = function(a0, a1, a2, a3, b) {\r