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

Javascript 如何使用node.js创建一个函数来计算图形曲线下的面积?,javascript,node.js,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*

我需要做一个函数,这样当我在命令行中输入函数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();}}
    );
我的提示文件如下所示:

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());
});
感谢您的帮助:)

将读取字符串并对其求值。如果要使用参数
x
计算函数
f
,则只需编写
f(x)
,而无需调用
eval()
。这是因为,在JavaScript中,可以像数字、字符串等一样进行传递

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);
读取字符串并对其求值。如果要使用参数
x
计算函数
f
,则只需编写
f(x)
,而无需调用
eval()
。这是因为,在JavaScript中,可以像数字、字符串等一样进行传递

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);
应使用来计算字符串数学表达式,例如:

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
*/
var-math=require('mathjs');
var积分=函数(f,a,b,n,next){
a=浮点数(a);
b=浮点数(b);
n=parseInt(n);
var h=(b-a)/n;
var s=0;
var suma=函数(){
对于(var i=0;i您应该使用来计算字符串数学表达式,例如:

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
*/
var-math=require('mathjs');
var积分=函数(f,a,b,n,next){
a=浮点数(a);
b=浮点数(b);
n=parseInt(n);
var h=(b-a)/n;
var s=0;
var suma=函数(){

对于(var i=0;i首先,如果你想计算曲线下的面积,你需要提供一个上下限,否则答案总是无限的。我个人使用:

函数findArea(下限、上限、系数){
设下限=0
设上限=0
for(设i=0;i<系数.length;i++){
lower+=(系数[i]*Math.pow(lowerLimit,i+1))/(i+1)
上限+=(系数[i]*Math.pow(上限,i+1))/(i+1)
}
返回Math.abs(上-下)
}
如果你以a+bx+cx^2+dx^3…等格式输入两个数字作为限制和一个系数数组,你将得到正确的答案。例如,假设你有方程y=5+4x+3x^2+2x^3,你想找到x=1和x=3之间曲线下的面积,你可以这样调用这个函数,
findArea(1,3,[5,4,3,2])
您将得到表示平方单位数的答案
92
。请记住,只有当您正在计算的面积完全高于或完全低于x轴时,此方法才有效。如果您的面积穿过x轴,则需要分别计算上下面积!


您可以对照检查结果,但这应该适用于任何曲线。

首先,如果要计算曲线下的面积,您需要提供一个x下限和x上限,否则答案将始终是无限的。我个人使用:

函数findArea(下限、上限、系数){
设下限=0
设上限=0
for(设i=0;i<系数.length;i++){
lower+=(系数[i]*Math.pow(lowerLimit,i+1))/(i+1)
上限+=(系数[i]*Math.pow(上限,i+1))/(i+1)
}
返回Math.abs(上-下)
}
如果你以a+bx+cx^2+dx^3…等格式输入两个数字作为限制和一个系数数组,你将得到正确的答案。例如,假设你有方程y=5+4x+3x^2+2x^3,你想找到x=1和x=3之间曲线下的面积,你可以这样调用这个函数,
findArea(1,3,[5,4,3,2])
您将得到表示平方单位数的答案
92
。请记住,只有当您正在计算的面积完全高于或完全低于x轴时,此方法才有效。如果您的面积穿过x轴,则需要分别计算上下面积!


您可以对照检查结果,但这应该适用于任何曲线。

首先,您错误地使用了parseInt和parseFloat。这些函数不改变变量。它们只返回解析值。您必须像这样使用它们:
a=parseFloat(a)
首先,您使用的parseInt和parseFloat是错误的。这些函数不改变变量。它们只返回解析后的值。您必须这样使用它们:
a=parseFloat(a);
如果您想将当前函数参数保持为字符串,您可以执行
(新函数(“x”,“return”+f))(x)
将其转换为函数并立即执行。我不允许使用JavaScript作为它自己的预处理器。询问者应该编写一个函数作为
f
传递。如果
f
字符串格式不正确怎么办?那你就完了。简单一点,只要不要使用
eval
。如果你想保留当前的函数就可以了gument作为一个字符串,您可以使用
(新函数(“x”,“return”+f))(x)
将其转换为函数并立即执行。我不允许使用JavaScript作为它自己的预处理器。