【发布时间】:2020-12-01 04:55:41
【问题描述】:
【问题讨论】:
-
连接 B 点和 C 点的曲线可以有无数条。您将如何决定需要哪条曲线?
标签: javascript math graph jsxgraph
【问题讨论】:
标签: javascript math graph jsxgraph
如评论中所述,所述问题没有唯一的解决方案。一种可能性是选择许多样条曲线之一。我会提出一个使用高中数学的非常简单的方法:取一个三阶多项式 f,它穿过点 B 和 C 并且其导数在 B 处等于线 AB 的斜率,并且其在 C 处的导数等于线 CD 的斜率。
为方便起见,我们假设 B 的 x 坐标为 0,C 的 x 坐标为 1。此外,我们用 表示线 AB 的斜率>s1 和 CD 线与 s2 的斜率。对于一般的解决方案,我们必须稍后将 s1 和 s2 乘以 C_x - B_x。
现在,我们要计算多项式的参数a,b,c,d
f(x) = ax^3 + bx^2 + cx + d.
这可以通过注意来完成
请参阅下面代码中的函数f。当我们知道多项式f时,
f的最大值可以很容易地通过计算导数的根来确定
f'(x) = 3ax^2 + 2bx + c
代码如下:
var A, B, C, D, l1, l2, f, g, maximum, curve, E;
A = board.create('point', [-4,-2]);
B = board.create('point', [-2,2]);
C = board.create('point', [1, 2]);
D = board.create('point', [3, 0]);
l1 = board.create('line', [A, B]);
l2 = board.create('line', [C, D]);
f = function(x) {
var dx = C.X() - B.X(),
s1 = l1.getSlope() * dx,
s2 = l2.getSlope() * dx,
a, b, c, d;
d = B.Y();
c = s1;
a = s2 - s1 - 2 * (C.Y() - c - d);
b = C.Y() - c - d - a;
return a * x * x * x + b * x * x + c * x + d;
};
g = function(x) {
return f((x - B.X()) / (C.X() - B.X()));
};
maximum = function() {
var dx = C.X() - B.X(),
s1 = l1.getSlope() * dx,
s2 = l2.getSlope() * dx,
a, b, c, d, x1, x2, x, dis;
d = B.Y();
c = s1;
a = s2 - s1 - 2 * (C.Y() - c - d);
b = C.Y() - c - d - a;
dis = 4 * b * b - 12 * a * c;
x1 = (-2 * b + Math.sqrt(dis)) / (6 * a);
x2 = (-2 * b - Math.sqrt(dis)) / (6 * a);
if (6 * a * x1 + 2 * b < 0) {
x = x1;
} else {
x = x2;
}
x = x * (C.X() - B.X()) + B.X();
return [x, g(x)];
};
curve = board.create('functiongraph', [g], {strokeCOlor: 'red', strokeWidth: 3});
E = board.create('point', [maximum]);
【讨论】: