dwo/math

处理某些数学内容的库。实现或部分实现的数学概念包括:复数、矩阵、正态分布、随机数、角度、随机复数、描述性统计、参数检验(方差分析、相关t检验)和非参数检验(威尔科克斯符号秩检验)。

v1.0.0 2016-11-10 19:30 UTC

This package is not auto-updated.

Last update: 2024-09-23 12:09:20 UTC


README

Build Status

处理某些数学内容的库。

实现或部分实现的数学概念包括:复数矩阵正态分布随机数角度随机复数描述性统计参数检验方差分析相关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);

但是,您可以使用 rhotheta 值创建复数,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开源许可

在此特此授予任何获得本软件及其相关文档副本(以下简称“软件”)的人,免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许软件的提供者这样做,但受以下条件的约束

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,除非另有规定,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和无侵犯性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论是在合同行为、侵权或其他行为中产生的,无论是与软件或其使用或其他方式有关。