我需要创建函数,以便在我在命令行输入函数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());
});
感谢您的帮助:)
答案 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 = 1 和x = 3 你可以像这样调用这个函数,findArea(1, 3, [5, 4, 3, 2])
,你会得到答案 92
,它代表单位的平方数。请记住,这仅在您评估的区域完全高于或完全低于 x 轴时才有效。 如果您的区域与 x 轴交叉,则需要分别计算上方和下方的区域!
您可以对照 Symbolab Area Under The Curve Calculator 检查结果,但这应该适用于任何曲线。