dwo / math
处理某些数学内容的库。实现或部分实现的数学概念包括:复数、矩阵、正态分布、随机数、角度、随机复数、描述性统计、参数检验(方差分析、相关t检验)和非参数检验(威尔科克斯符号秩检验)。
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-23 12:09:20 UTC
README
处理某些数学内容的库。
实现或部分实现的数学概念包括:复数、矩阵、正态分布、随机数、角度、随机复数、描述性统计、参数检验(方差分析、相关t检验)和 非参数检验(威尔科克斯符号秩检验、威尔科克斯-曼-惠特尼检验、克鲁斯卡尔-沃尔利斯检验)。
安装
您可以通过下载 ZIP存档、克隆此仓库或使用以下代码通过 Composer 将其放入您的 composer.json
文件中安装此库:
{ "require": {"malenki/math": "dev-master"} }
角度
您可以使用度、弧度、弧度或周为角度。默认情况下,使用弧度。
use \Malenki\Math\Unit\Angle; $a = new Angle(pi()/2); var_dump($a->deg); // get degrees var_dump($a->rad); // get radians var_dump($a->gon); // get radians var_dump($a->turn); // get turns
您还可以获取DMS风格的角度
use \Malenki\Math\Unit\Angle; $a = new Angle(34.53, Angle::TYPE_DEG); var_dump($a->dms); // get DMS object var_dump($a->dms->str); // get DMS string '34°31′48″'
您可以测试当前角度是否为 直角、平角 或 周角
use \Malenki\Math\Unit\Angle; $a = new Angle(pi() / 2); var_dump($a->isRight()); // should return TRUE $b = new Angle(pi()); var_dump($b->isStraight()); // should return TRUE $c = new Angle(2 * M_PI); var_dump($c->isPerigon()); // should return TRUE $d = new Angle(450, Angle::TYPE_DEG); //yes, ignore multiple turns :) var_dump($d->isRight()); // should return TRUE
您可以将当前角度与另一个角度进行比较,以确定它们是否是 互补 或 补角
use \Malenki\Math\Unit\Angle; $a = new Angle(M_PI / 3); $b = new Angle(M_PI / 6); var_dump($a->isComplementary($b)); // should be TRUE var_dump($b->isComplementary($a)); // should be TRUE $c = new Angle(M_PI / 2); $d = new Angle(90, Angle::TYPE_DEG); var_dump($c->isSupplementary($d)); // should be TRUE var_dump($d->isSupplementary($c)); // should be TRUE
矩阵
创建矩阵很简单,首先用列数和行数实例化它,第二步,将数据放入其中。
use \Malenki\Math\Matrix; //instanciate $m = new Matrix(3, 2); //then populate $m->populate(array(1,2,3,4,5,6)); //or $m->addRow(array(1, 2)); $m->addRow(array(3, 4)); $m->addRow(array(5, 6)); //or $m->addCol(array(1, 3, 5)); $m->addCol(array(2, 4, 6));
获取数据也不难。您可以得到矩阵的大小、行或列的内容、所有数据,甚至以字符串形式导出。
var_dump($m->cols); // amount of columns var_dump($m->rows); // amount of rows var_dump($m->getRow(0)); // get row having index 0 var_dump($m->getCol(1)); // get column having index 1 var_dump($m->getAll()); // Gets all data as array // following will output that: // 1 2 // 3 4 // 5 6 print($m);
获取矩阵的转置就像那样简单
echo $m->transpose();
好了,您可以获取、设置……但是您还可以做更复杂的事情。
您可以与另一个矩阵 相乘,但请注意兼容性!
use \Malenki\Math\Matrix; $n = new Matrix(2, 3); $n->populate(array(7, 8, 9, 10, 11, 12)); if($m->multiplyAllow($n)) { print($m->multiply($n)); }
您还可以与标量或复数相乘
use \Malenki\Math\Number\Complex; $z = new Complex(2, -3); $n->multiply(2); $n->multiply($z);
加法 也是可能的,您必须在每个矩阵的大小相同之前进行测试,或者捕获异常。
try { echo $m->add($n); } catch(\Exception $e) { echo $e->getMessage(); } //or if($m->sameSize($n)) { echo $m->add($n); } else { echo "Cannot add M to N: not the same size!"; }
获取方阵的 行列式 很简单,只需这样做:
use \Malenki\Math\Matrix; $m = new Matrix(2,2); $m->populate(array(1,2,3,4)); var_dump($m->det()); // should be -2
如果您尝试获取非方阵的行列式,您将得到一个异常。
方阵的 逆 很简单,就像您想象的那样,是这样的
use \Malenki\Math\Matrix; $m = new Matrix(2,2); $m->populate(array(1,2,3,4)); $i = $m->inverse(); echo $i; // should be: // -2 1 // 1.5 -0.5
前一种方法中使用的前置矩阵,是通过这种方式计算的
use \Malenki\Math\Matrix; $m = new Matrix(2,2); $m->populate(array(1,2,3,4)); $c = $m->cofactor(); echo $c;
复数
使用复数就像一个孩子的游戏:用实部和虚部实例化它。这就是全部!
use \Malenki\Math\Number\Complex; $z = new Complex(2, -3);
但是,您可以使用 rho 和 theta 值创建复数,theta 可以是简单的浮点数或 Angle 对象
use \Malenki\Math\Number\Complex; use \Malenki\Math\Unit\Angle; $z = new Complex(1, pi(), Complex::TRIGONOMETRIC); // or $a = new Angle(M_PI); $z = new Complex(1, $a); // 3rd argument is useless if Angle is used as second argumeent
复数对象也像字符串一样工作,记住其原始形式
use \Malenki\Math\Number\Complex; use \Malenki\Math\Unit\Angle; $z = new Complex(2, -3); echo $z; // print "2-3i" $zz = new Complex(1, new Angle(3 * M_PI / 2)); echo $zz; // print "cos 4.712389 + i⋅sin 4.712389"
您有一些神奇的获取器
use \Malenki\Math\Number\Complex; $z = new Complex(1,2); var_dump($z->real); // real part var_dump($z->re); // real part var_dump($z->r); // real part var_dump($z->imaginary); // imaginary part var_dump($z->im); //imaginary part var_dump($z->i); // imaginary part var_dump($z->rho); // modulus aka norm var_dump($z->theta); // argument (angle)
您可以进行加法和乘法
use \Malenki\Math\Number\Complex; $z = new Complex(1,2); $zz = new Complex(2,3); echo $z->add($zz); // give new complex nulber echo $z->multiply($zz); // give another complex number
获取负数和共轭也很简单
use \Malenki\Math\Number\Complex; $z = new Complex(1,2); echo $z->conjugate(); echo $z->negative();
正态分布
您可以为给定的平均值和标准差玩图形,或者生成伪样本。
一些示例以供理解
use \Malenki\Math\NormalDistribution; // Normal Distribution with mean equals to 2 and has standard deviation of 0.3 $nd = new NormalDistribution(2, 0.3); // you can get value of function: $nd->f(3); // you can generate fake sample following the current normal distribution: $md->samples(100); // 100 elements into an array
阶乘
您可以得到一个整数的阶乘,它很容易使用,通过 n
等级实例化它,然后通过调用 result
属性获取值。
use \Malenki\Math\Factorial; $f = new Factorial(5); $f->result; // should be 120 $f->n; // you can get rank as reminder too.
也有字符串上下文可用
use \Malenki\Math\Factorial; $f = new Factorial(5); echo $f; // string '120'
随机数
您可以玩随机数,包括整数范围或介于 0 和 1 之间的浮点数。
您可以取一个
use \Malenki\Math\Random; $r = new Random(); // double form 0 to 1 only var_dump($r->get()); $r = new Random(-5, 18); // integer range var_dump($r->get());
您可以取许多
use \Malenki\Math\Random; $r = new Random(); // double form 0 to 1 only var_dump($r->getMany(5)); $r = new Random(-5, 18); // integer range var_dump($r->getMany(5));
您可以取许多不重复的
use \Malenki\Math\Random; $r = new Random(); // double form 0 to 1 only var_dump($r->getManyWithoutReplacement(5)); $r = new Random(-5, 18); // integer range var_dump($r->getManyWithoutReplacement(5));
随机复数
这个类允许您在给定的范围内获取一个或多个复数,包括实部和虚部或rho和theta。
因此,要获取一个复数,其实部在[2, 6.5]
范围内,虚部在[-2, 5]
范围内,您必须这样做
use \Malenki\Math\RandomComplex; $rc = new RandomComplex(); $rc->r(2, 6.5)->i(-2, 5)->get();
您也可以使用三角形式来做到这一点,但现在生成10个项
use \Malenki\Math\RandomComplex; $rc = new RandomComplex(); $rc->rho(1, 5)->theta(M_PI / 4, M_PI /2)->getMany(10);
描述性统计
您可以对数据进行很多统计,如平均值、方差、标准差、峰度等。
在实例化时可以一次性放置所有值
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4));
之后也可以添加其他数据
$s->merge(array(8,4,6,3)); // to add several values $s->add(5); // to add one by one value
使用count()
计数非常简单
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4)); var_dump(count($s));
也有许多平均值可供选择
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4)); // arithmetic mean var_dump($s->arithmeticMean()); var_dump($s->arithmetic_mean); var_dump($s->mean); var_dump($s->A); var_dump($s->mu); // harmonic mean var_dump($s->harmonicMean()); var_dump($s->harmonic_mean); var_dump($s->subcontrary_mean); var_dump($s->H); // geometric mean var_dump($s->geometricMean()); var_dump($s->geometric_mean); var_dump($s->G); // root mean square aka RMS var_dump($s->rootMeanSquare()); var_dump($s->root_mean_square); var_dump($s->rms); var_dump($s->quadratic_mean); var_dump($s->Q);
方差、总体或样本与标准差一起可用
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4)); // Variance (population) var_dump($s->variance()); var_dump($s->var); var_dump($s->variance); var_dump($s->population_variance); // Variance (sample) var_dump($s->sampleVariance()); var_dump($s->sample_variance); var_dump($s->s2); // Standard deviation var_dump($s->standardDeviation()); var_dump($s->standard_deviation); var_dump($s->stdev); var_dump($s->stddev); var_dump($s->sigma);
四分位数和中位数
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4)); var_dump($s->quartile(1)); var_dump($s->quartile(2)); //or var_dump($s->mediane()); var_dump($s->quartile(3)); // or just by magic getters: var_dump($s->first_quartile); var_dump($s->second_quartile); var_dump($s->third_quartile); var_dump($s->last_quartile); var_dump($s->mediane);
获取众数
$s = new Stats(array(1,2,3,2,4,1,5)); var_dump($s->mode); // returned array has 2 values $s = new Stats(array(1,3,2,4,1,5)); var_dump($s->mode); // returned array has 1 value
频率、相对频率和累积频率
var_dump($s->frequency); var_dump($s->relative_frequency); var_dump($s->cumulative_frequency); // or methods var_dump($s->frequency()); var_dump($s->relativeFrequency()); var_dump($s->cumulativeFrequency());
峰度和其测试也是可用的
use \Malenki\Math\Stats\Stats; $s = new Stats(array(1,2,4,2,6,4)); var_dump($s->kurtosis); var_dump($s->is_platykurtic); var_dump($s->is_leptokurtic); var_dump($s->is_mesokurtic); // or method way: var_dump($s->kurtosis()); var_dump($s->isPlatykurtic()); var_dump($s->isLeptokurtic()); var_dump($s->isMesokurtic());
参数测试
方差分析(ANOVA)
一个例子比长篇大论要好
use Malenki\Math\Stats\ParametricTest\Anova; $a = new Anova(); $a->add(array(6, 8, 4, 5, 3, 4)); $a->add(array(8, 12, 9, 11, 6, 8)); $a->add(array(13, 9, 11, 8, 7, 12)); // degrees of freedom echo $a->degrees_of_freedom; echo $a->dof; echo $a->degreesOfFreedom(); echo $a->dof(); // Within group degrees of freedom echo $a->within_group_degrees_of_freedom; echo $a->WithinGroupDegreesOfFreedom(); echo $a->wgdof(); echo $a->f; //or echo $a->f_ratio; //or echo $a->f(); //or echo $a->fRatio(); // should be around 9.3
相关t-检验
use Malenki\Math\Stats\ParametricTest\TTest; $t = new Dependant(); $t->add(array(24, 17, 32, 14, 16, 22, 26, 19, 19, 22, 21, 25, 16, 24, 18)); $t->add(array(26, 24, 31, 17, 17, 25, 25, 24, 22, 23, 26, 28, 19, 23, 22)); // Degree Of Freedom echo $t->dof(); // should be 14 // Sigma, the standard deviation echo $t->sigma(); // Should be around 0.608 // The t-value echo $t->t(); // Should be around -4.054
非参数测试
Wilcoxon符号秩检验
待办事项
开发中,更多信息将很快在这里的源代码中提供!
MIT开源许可
在此特此授予任何获得本软件及其相关文档副本(以下简称“软件”)的人,免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许软件的提供者这样做,但受以下条件的约束
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,除非另有规定,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和无侵犯性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同行为、侵权或其他行为中产生的,无论是与软件或其使用或其他方式有关。