filmtools/polynomial

2.0.1 2019-04-26 14:35 UTC

This package is auto-updated.

Last update: 2024-09-27 02:26:33 UTC


README

用于处理简单多项式模型的工具。

安装

$ composer require filmtools/polynomial

从 v1 升级

从 v2 开始,此包现在尽可能使用 SplFixedArrays。这可能会影响所有您的 CoefficientProviderInterface 实现,因为它们现在需要返回 \SplFixedArray

无论您何时使用 FromCoefficientsInterpolatorMultipleInterpolator 进行计算,您都会得到 \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, XFinderInterfaceCoefficientsProviderInterface

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 以及 XNotFoundExceptionYNotFoundException 都扩展自 PolynomialModelException。所有这些都具有 PolynomialModelExceptionInterface 的共同点。当出现问题时使用这些。