如何使用node.js创建一个计算图形曲线下面积的函数?

时间:2016-03-30 21:18:52

标签: javascript node.js

我需要创建函数,以便在我在命令行输入函数f和系数a,b和n时计算面积。

现在我有了这个:

module.exports = function (f,a,b,n,next) {

parseFloat(a);
parseFloat(b);
parseInt(n);
var h = (b-a)/n;
var s = 0;
var suma = function () {
    for (var i = 0; i <= n; i++) {
        var ximj = a+h*(i-1);
        var xi = a+h*i;
        var x = (ximj + xi)/2;
        s += eval(f,x);
    }
    return s;
};

if (n<1) {
    next(new Error("Koeficijent n je broj ekvidistantnih točaka."))
}
else next(null, {povrsina : function () {return h*suma();}}
    );

我认为函数suma()无法正常工作。

在命令行中,这应该是:

f: x*x-2*x+7
a: 2
b: 4
n: 10
Povrsina ispod grafa funkcije f je 20.66000...

我的提示文件如下所示:

var pov = require('./integrator.js');

var prompt = require('prompt');

prompt.get (['f','a','b','n'],function (err,koef) {
if (err) return console.log(err);
console.log("f: ",koef.f);
console.log("a: ",koef.a);
console.log("b: ",koef.b);
console.log("n: ",koef.n);

parseFloat(koef.a);
parseFloat(koef.b);
parseInt(koef.n);

pov(koef.f,koef.a,koef.b,koef.n,function(err,rj){
    if (err)
        console.log(err);
    else 
        console.log("Povrsina ispod grafa funkcije f je " + rj.povrsina());
});

感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

eval function读取一个字符串并对其进行评估。如果您想使用参数f评估函数x,那么您只需编写f(x)而不是调用eval()。这是因为,在JavaScript中,functions are first-class values可以像数字,字符串等一样传递。

suma中,特别是行var ximj = a+h*(i-1);,您的for循环将h乘以-1,然后乘以0,再乘以1.我怀疑您的意思是var ximj = a+h*(i+1);因为h是差异的宽度。但这只会产生很小的错误。

正如Lends所写,您还需要更正Parse*来电:

a = parseFloat(a);
b = parseFloat(b);
n = parseInt(n);

答案 1 :(得分:0)

您应该使用math.js来评估字符串数学表达式,例如:

var math = require('mathjs');

var integral = function(f, a, b, n, next) {
    a = parseFloat(a);
    b = parseFloat(b);
    n = parseInt(n);
    var h = (b - a) / n;
    var s = 0;
    var suma = function() {
        for (var i = 0; i <= n; i++) {
            var ximj = a + h * (i - 1);
            var xi = a + h * i;
            var x = (ximj + xi) / 2;
            s += math.eval(f, { x: x });
        }

        return s;
    };

    if (n < 1) {
        next(new Error("Koeficijent n je broj ekvidistantnih točaka."))
    } else {
        next(null, { povrsina: function() { return h * suma(); } });
    }
};

var f = 'x * x - 2 * x + 7';
var a = '2';
var b = '4';
var n = '10000';

integral(f, a, b, n, function(err, rj) {
    if (err)
        console.log(err);
    else
        console.log("Povrsina ispod grafa funkcije f je " + rj.povrsina());
});

/* output:
Povrsina ispod grafa funkcije f je 20.66806662000201
*/

你的积分函数似乎有一个问题,n必须非常高才能达到预期的结果(如10000)。或者它应该以这种方式工作?对于n = 10,它例如给出22。

另一个解决方案是使用existing package或者至少阅读源代码以获得一个想法。

答案 2 :(得分:0)

首先,如果您想计算曲线下的面积,您将需要提供 x 上下限,否则答案将永远是无限的。我个人使用 this function that I wrote

function findArea(lowerLimit, upperLimit, coefficients) {

  let lower = 0
  let upper = 0

  for (let i = 0; i < coefficients.length; i++) {

    lower += (coefficients[i] * Math.pow(lowerLimit, i + 1)) / (i + 1)
    upper += (coefficients[i] * Math.pow(upperLimit, i + 1)) / (i + 1)

  }

  return Math.abs(upper - lower)

}

如果你传入两个数字作为极限和一个格式的系数数组,a + bx + cx^2 + dx^3 ... 等等,你会得到正确答案。例如,假设您有等式 y = 5 + 4x + 3x^2 + 2x^3,并且您想找到 x = 1x = 3 你可以像这样调用这个函数,findArea(1, 3, [5, 4, 3, 2]),你会得到答案 92,它代表单位的平方数。请记住,这仅在您评估的区域完全高于或完全低于 x 轴时才有效。 如果您的区域与 x 轴交叉,则需要分别计算上方和下方的区域!

您可以对照 Symbolab Area Under The Curve Calculator 检查结果,但这应该适用于任何曲线。