2016-03-30 14 views
0

Fonksiyonu, işlev alanına girdiğimde ve komut satırında a, b ve n katsayılarını hesaplayacak şekilde fonksiyon yapmam gerekiyor.node.js kullanılarak grafiğin eğrisinin altındaki alanı hesaplayacak bir işlev nasıl oluşturulur?

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();}} 
    ); 

Ben çalışıyor olması gerekir gibi işlev suma() çalışmadığını düşünüyorum: For

şimdi bu var.

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

Benim istemi dosya şuna benzer:

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()); 
}); 

yardım :)

+0

Öncelikle parseInt ve parseFloat hatalarını kullanırsınız. Bu işlevler değişkenleri değiştirmez. Sadece ayrıştırılan değeri döndürürler. Bunları şu şekilde kullanmalısınız: 'a = parseFloat (a);' – Lends

cevap

1

eval function için teşekkür ederiz bir dize okur ve

komut satırında aşağıdaki gibi görünür olmalıdır değerlendirir. f işlevini x parametresiyle değerlendirmek isterseniz, eval() numaralı telefonu aramak yerine f(x) yazabilirsiniz. Bunun nedeni, JavaScript’te functions are first-class values’dur ve sayı, dizge vb. Gibi etrafından geçirilebilir. suma olarak

, özellikle de hat var ximj = a+h*(i-1);, için için döngü çarpar 1 ile daha sonra 0 ile daha sonra -1 ile h, ben h yana var ximj = a+h*(i+1); için diferansiyel genişliği anlamına şüpheli. Ama bu sadece küçük hatalar üretecekti. örneğin,

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

Eğer mevcut fonksiyon argümanını bir dizge olarak tutmak isterseniz, '' (yeni fonksiyon ("x", "return" + f)) (x) 'bir fonksiyona dönüştürmek ve hemen yürütmek. –

+0

JavaScript'i kendi önişlemcisi olarak kullanmıyorum. Asker, 'f' olarak geçirilecek bir işlev yazmalıdır. Bir 'f' dizesi hatalıysa ne olur? Öyleyse sen kostun. Kolaylaştırın, sadece "eval" kullanmayın. –

0

Bir dize matematik ifade eval math.js kullanmalıdır:

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 
*/ 

İntegral fonksiyonu gibi görünüyor KrediBÜKREŞ, ayrıca Parse* aramaları düzeltmek gerekir yazdığı gibi

Bununla birlikte, bir sorunun olması, n beklenen sonuca yaklaşmak için çok yüksek olması gerekir (10000 gibi). Yoksa bu şekilde mi çalışması gerekiyor? N = 10 için, örneğin 22 verir.

Başka bir çözüm, bir fikir edinmek için existing package veya en azından kaynak kodunu okumaktır.

+0

22 Çünkü for-loop'um 0'dan başlıyor ama 1'den başlamalı ve beklenen sonuca yaklaşmam gerekiyor. –

+0

@DraganaOstopanj Tamam, matematik yeteneğim paslı: p 1 ile başlar, n = 10 ile doğru sonuç verir. – Shanoor

İlgili konular