【问题标题】:How to set initial position of draggable points in JSXGraph in an equation graph?如何在方程图中设置 JSXGraph 中可拖动点的初始位置?
【发布时间】:2018-08-23 09:27:24
【问题描述】:

我正在开发一个网络软件,它在 JSXGraph 上绘制一个具有 2 个变量的交互式多项式方程,我需要方程的导数为 0 的每个点都有一个可拖动的点,并且当我拖动一个点时,只有曲线拖动点之后的 1 点和之前的 1 点之间的间隔有谁知道我该怎么做?

【问题讨论】:

  • 你能发布一个示例方程吗?
  • 多项式的次数是否应该保持不变?这听起来像拉格朗日插值或某种样条插值。
  • 很抱歉花了太长时间来回答,我遇到了一些个人问题,现在我回来了。方程的一个例子: y = -0.0037*x^5 + 0.071*x^4 + -0.35*x^3 + -0.23*x^2 + 2.8*x + 5.6 不,多项式的次数不是需要保持不变

标签: javascript math jsxgraph math.js


【解决方案1】:

抱歉耽搁了。我想,您需要的是 Hermite 插值。我最近在 Google 群组(https://groups.google.com/forum/#!topic/jsxgraph/OHls2NTOmUA)中举了一个例子。 Hermite 插值还没有集成到 JSXGraph 中,但似乎有需求,所以我们可以考虑一下。

代码如下:

JXG.Math.Numerics.hermitePolynomial = function (p, derivatives) {
        var w = [],
            Lii = [],

            /** @ignore */
            fct = function (x, suspendedUpdate) {
                var i, k, xi, s,
                    L, Hi, Hi_hat,
                    len = p.length,
                    num = 0,
                    denom = 0;

                if (!suspendedUpdate) {
                    // Compute denominator
                    for (i = 0; i < len; i++) {
                        w[i] = 1.0;
                        Lii[i] = 0.0;
                        xi = p[i].X();

                        for (k = 0; k < len; k++) {
                            if (k !== i) {
                                w[i] *= (xi - p[k].X());
                                Lii[i] += 1 / (xi - p[k].X());
                            }
                        }

                        w[i] = 1 / w[i];
                    }
                }

                s = 0.0;
                for (i = 0; i < len; i++) {
                    xi = p[i].X();
                    L = w[i];
                    for (k = 0; k < len; k++) {
                        if (k !== i) {
                            L *= (x - p[k].X());
                        }
                    }

                    Hi = (1.0 - 2 * (x - xi) * Lii[i]) * L * L;
                    Hi_hat = (x -xi) * L * L;
                    s += p[i].Y() * Hi + derivatives[i] * Hi_hat;
                }
                return s;
            };

        return fct;
    };

var board = JXG.JSXGraph.initBoard("jxgbox", {
            boundingbox: [-5, 6, 6, -5],
            axis: true
});

var p = [];
// Define the points
p[0] = board.create('point', [-1,2], {size:4});
p[1] = board.create('point', [1,-2], {size:4});
p[2] = board.create('point', [3,-1], {size:4});

// The derivates at this points are all zero.
var derivatives = [0, 0, 0];

var f = JXG.Math.Numerics.hermitePolynomial(p, derivatives);
var graph = board.create('functiongraph', [f, -10, 10], {strokeWidth:2});

现场演示在https://jsfiddle.net/vcL7aepo/278/

最好的祝愿, 阿尔弗雷德

【讨论】:

  • 您能解释一下这段代码是如何工作的吗?因为我传递了我想要绘制的方程作为来自其他 js 文件的参数。这是我的项目github.com/tatisstiv/equation_plotter_and_editor 我想用你的代码代替 equationchart.js
  • 现在我开始明白了。您希望 a) 交出 y = polynomial(x) 形式的方程式。 b) 然后,必须找到某个区间内的极值。 c) 在这些极值坐标处,创建 JSXGraph 点。 d) 拖动这些点时,曲线应该会适应,但要保持 JSXGraph 点处的极值点。
猜你喜欢
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多