filmtools / polynomial
Requires
- php: ^7.1
- bentools/iterable-functions: ^1.2
- dr-que/polynomial-regression: v1.2.1.1
Requires (Dev)
- php-coveralls/php-coveralls: ^2.0
- phpunit/phpunit: ^5.7|^6.0|^7.0
- spatie/phpunit-watcher: ^1.8
README
用于处理简单多项式模型的工具。
安装
$ composer require filmtools/polynomial
从 v1 升级
从 v2 开始,此包现在尽可能使用 SplFixedArrays。这可能会影响所有您的 CoefficientProviderInterface 实现,因为它们现在需要返回 \SplFixedArray。
无论您何时使用 FromCoefficientsInterpolator 或 MultipleInterpolator 进行计算,您都会得到 \SplFixedArray 结果。当您依赖于数组结果时,只需调用 $result->toArray()
,如 SplFixedArray 方法 API 中定义的那样。
包中包含的内容
接口
CoefficientsProviderInterface: 返回多项式模型的系数。
public function getCoefficients(): \SplFixedArray;
InterpolatorInterface: 找到给定 x 坐标对应的 y 值。
public function interpolate( float $x ): float;
XFinderInterface: 找到给定 y 的 x,与 InterpolatorInterface::interpolate 相反
public function findX( float $y ) : float;
PolynomialModelInterface 扩展上述 InterpolatorInterface, XFinderInterface 和 CoefficientsProviderInterface
PolynomialModelProviderInterface 返回多项式模型接口实例。
public function getPolynomialModel(): PolynomialModelInterface;
FromCoefficientsInterpolator
此可调用类使用在调用时提供的 系数 对 iterable 中的 X 值进行插值
<?php use FilmTools\PolynomialModel\FromCoefficientsInterpolator; // Use these X values every time: $x_iterable = array(1,2,3); $fci = new FromCoefficientsInterpolator( $x_iterable ); // Now find Y for each X $coefficients_iterable = [ 0 => 2, 1 => 3 ]; $interpolated = $fci( $coefficients_iterable ); // SplFixedArray [ 5, 8, 11 ]
您还可以在调用时传递 自定义 X 值
$fci = new FromCoefficientsInterpolator; $coefficients = array(2,3); $x_values = array(1,2,3); // Now find Y for each X $interpolated = $fci( $coefficients, $x_values); // SplFixedArray [ 5, 8, 11 ]
插值方法还接受 CoefficientsProviderInterface:
use FilmTools\PolynomialModel\CoefficientsProviderInterface; use FilmTools\PolynomialModel\FromCoefficientsInterpolator; class MyModel implements CoefficientsProviderInterface { public function getCoefficients(): \SplFixedArray { return \SplFixedArray::fromArray(array(2,3)); } } $x_values = array(1,2,3); $fci = new FromCoefficientsInterpolator( $x_values ); $interpolated = $fci( new MyModel ); // SplFixedArray [ 5, 8, 11 ]
MultipleInterpolator
使用相同的默认 系数 对 iterable 中的 X 值进行插值。插值方法返回一个 SplFixedArray。构造函数接受一个数字 iterable 以及 CoefficientsProviderInterface
<?php use FilmTools\PolynomialModel\MultipleInterpolator; $coefficients = array(2,3); $mi = new MultipleInterpolator( $coefficients ); $x_iterable = array(1,2,3); $interpolated = $mi->interpolate( $x_iterable ); $interpolated = $mi( $x_values ); // SplFixedArray [ 5, 8, 11 ]
DerivativeCoefficientsProvider
计算给定一组系数(数组或 Provider)的导数多项式的系数。
<?php use FilmTools\PolynomialModel\DerivativeCoefficientsProvider; use FilmTools\PolynomialModel\CoefficientsProviderInterface; class MyModel implements CoefficientsProviderInterface { public function getCoefficients(): \SplFixedArray { // Keys are exponents, values are factors! return \SplFixedArray::fromArray( [0=>16, 1=>30, 2=>5, 3=> 18 ]); } } $my_provider = new MyModel; $derivation_provider = new DerivativeCoefficientsProvider( $my_provider ); $coefficients = $derivation_provider->getCoefficients(); // SplFixedArray( 0 => 30, 1 => 10, 2 => 54)
该类本身实现 CoefficientsProviderInterface,因此与 MultipleInterpolator 一起工作非常好。以下是一个使用上述 MyModel 类的示例
use FilmTools\PolynomialModel\DerivativeCoefficientsProvider; use FilmTools\PolynomialModel\MultipleInterpolator; $derivated_coefficients = new DerivativeCoefficientsProvider( new MyModel ); $interpolator = new MultipleInterpolator( $derivated_coefficients ); $x_values = array(1,2,3); $slopes = $interpolator->interpolate( $x_values ); // SplFixedArray 94, 266, 546
异常
PolynomialModelException 扩展 \Exception 并实现 PolynomialModelExceptionInterface。
NotEnoughPointsException 以及 XNotFoundException 和 YNotFoundException 都扩展自 PolynomialModelException。所有这些都具有 PolynomialModelExceptionInterface 的共同点。当出现问题时使用这些。