skip to main |skip to sidebar
显示标签为“Math”的博文。显示所有博文
显示标签为“Math”的博文。显示所有博文

2008年2月16日

[AS3,Math]立方根

/**
* 立方根
*
* @param v 一个数字。
* @return 数字的立方根。
*/

public static function cbrt(value:Number):Number {
return Math.pow(value, 1/3);
}

2008年2月3日

[AS3,Math]微分

/**
* 微分。
*
* @param f 被微分的函数
* @param x x。
* @param delta dx的大小。
* @return f(x)的斜率。
*/

public static function diff(f:Function, x:Number, delta:Number = 1e-8):Number {
return (f(x+delta) - f(x)) / delta;
}

2008年1月31日

[AS3]拟柱体数值积分

/**
* 在[a, b]间的拟柱体数值积分。

* @param f 积分函数
* @param a 左界限
* @param b 右界限
* @return [a, b]间的定积分
*/

public static function cylinderInte(f:Function, a:Number, b:Number):Number {
var h:Number = b-a;
return (h/6)*(f(a) + 4*f( (a+b) / 2 ) + f(b));
}

2008年1月30日

[AS3]辛普森数值积分

/**
* 在[a, b]间的辛普森数值积分
* @param f 积分函数
* @param a 左界限
* @param b 右界限
* @param n 分段数
* @return [a, b]间的定积分
*/

public static function simpsonInte(f:Function, a:Number, b:Number, n:int = 1024):Number {
n*=2;//2n => n
var h:Number = (b-a) / (n);
var x1:Number = 0;
var x2:Number = 0;
n--;//2n-1 => n
for(var i:int = 1; i i++*/) {
x1 += f(a + i*h);
i++;//i+1 => i
x2 += f(a + i*h);
}
return (h/3)*(f(a) + f(b) + 4*x1 + 2*x2);
}

2008年1月29日

[AS3]梯形数值积分

/**
* 在[a, b]间的梯形数值积分
* @param f 被积分函数
* @param a 左界限
* @param b 右界限
* @param n 分段数
* @return [a, b]间的定积分
*/

public static function trapezoidalInte(f:Function, a:Number, b:Number,n:int = 1024):Number {
var h:Number = (b-a) / n;
var result:Number = 0;
n--;//n-1 => n
for(var i:int = 1; i<n; i++) {
result += f(a + i*h);
}
return (h/2)*(f(a) + f(b) + 2*result);
}

2008年1月28日

[AS3]忽略符号的四舍五入

/**
* 忽略符号的四舍五入。
*
* AMath.rint(1.2) //-> 1
* AMath.rint(-1.2)//-> -1
* AMath.rint(1.7) //-> 2
* AMath.rint(-1.7)//-> -2

* @param v a Number
* @return Rounded Nuumber.
*/

public static function rint(v:Number):int {
if(v > 0) {
return int(v + 0.5);
}
if(v < 0) {
return -int(-v + 0.5);
}else{
return 0;
}
}

2008年1月24日

[AS3]生成呈高斯分布的伪随机数(2)

/**
* 用极坐标法(polar method)生成一个呈高斯分布的伪随机数。
*
* 这使用了 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的极坐标法,
* 该方法在 Donald E. Knuth 的 The Art of Computer Programming,
* Volume 3:Seminumerical Algorithms 的第 3.4.1 节,小节 C,算法 P 中进行了描述。
* 注意,它只需调用一次 Math.log 和调用一次 Math.sqrt 就可以生成两个独立的值
*
* @param mu 平均值μ
* @param sigma 标准差σ^2
*
* @return 伪随机数。
*/

public static function getGaussian2(mu:Number = 0, sigma:Number = 1):Number {
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
var v1:Number, v2:Number, s:Number;
do {
v1 = 2 * Math.random() - 1; // between -1.0 and 1.0
v2 = 2 * Math.random() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
var multiplier:Number = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1*multiplier*sigma + mu;
}
}

private static var nextNextGaussian:Number;
private static var haveNextNextGaussian:Boolean = false;

2008年1月23日

[AS3]生成呈高斯分布的伪随机数

/**
* 用雅可比变换生成一个呈高斯分布的伪随机数。
*
* @param mu 平均值μ
* @param sigma 标准差σ^2
* @return 伪随机数。
*/

public static function getGaussian(mu:Number = 0, sigma:Number = 1):Number {
var r1:Number = Math.random();
var r2:Number = Math.random();
return Math.sqrt( -2*Math.log(r1) ) * Math.cos( 2*Math.PI*r2 ) * sigma+mu;
}