* ベジェ曲線の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
}\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