Commons Math学习笔记——多项式函数

本文介绍了Apache Commons Math库中的多项式函数,包括`PolynomialFunction`和`PolynomialSplineFunction`。`PolynomialFunction`用于表示实数系数的一元多项式,实现了一元可微分函数接口,支持加减乘等运算。`PolynomialSplineFunction`则用于构建多项式样条函数,由多个多项式分段定义。文章通过示例展示了这些类的使用方法。
摘要由CSDN通过智能技术生成

2.2 多项式函数

看其他篇章到目录 选择。

在 Commons Math中的 analysis.polynomials包中有所有的与多项式函数相关的类和接口定义。这一篇主要从这个包分析,来研究一下多项式函数的应用。


 

Polynomials包中没有 interface的定义,下属含有 5个类: PolynomialFunction、 PolynomialFunctionLagrangeForm、 PolynomialFunctionNewtonForm、 PolynomialSplineFunction和 PolynomialsUtils。其中主要的只有 PolynomialFunction和 PolynomialSplineFunction,正如 api doc中的介绍, PolynomialFunction类是 Immutable representation of a real polynomial function with real coefficients——实数多项式的表示; PolynomialSplineFunction类是 Represents a polynomial spline function.——样条曲线多项式的表示。另外两个表示拉格朗日和牛顿形式的多项式函数。而 PolynomialsUtils类中提供了几个构造个别(比如切比雪夫多项式)多项式的静态方法。

我觉得最常用的应该就是实数系数的多项式了,因此以 PolynomialFunction类为例来进行分析。实数系数的多项式函数形如: f(x) = ax^2 + bx + c。 PolynomialFunction类实现了 DifferentiableUnivariateRealFunction接口,因此必须实现 value()和 derivative()方法,并且实现该接口也表明这是一元可微分的实数函数形式。 PolynomialFunction类定义了一组 final double coefficients[]作为多项式系数,其中 coefficients[0]表示常数项的系数, coefficients[n]表示指数为 n的 x^n次项的系数。因此,这个类所表达的多项式函数是这样的: f(x)=coeff[0] + coeff[1]x + coeff[2]x^2 + … + coeff[n]x^n。它的构造方法是 PolynomialFunction(double [])就是接受这样的 coefficients数组作为系数输入参数来构造多项式的。这个是很好表达也很方便理解的。那么它的 value(double x)方法是通过调用 double evaluate(double [] coefficients, double argument)实现的,本质用 Horner's Method求解多项式的值,没有什么技术难点,非常好理解的一个给定参数和函数求值过程。剩余定义的一些加减乘等操作,都是通过一个类似public PolynomialFunction add(final PolynomialFunction p)这样的结构实现的。求导数的方法 derivative()是通过这样的一个微分操作实现的。见源码:

 

 
 1 protected   static   double [] differentiate( double [] coefficients)  {
 2          int  n  =  coefficients.length;
 3          if  (n  <   1 {
 4              throw  MathRuntimeException.createIllegalArgumentException( " empty polynomials coefficients array " );
 5         }

 6          if  (n  ==   1 {
 7              return   new   double [] { 0 } ;
 8         }

 9          double [] result  =   new   double [n  -   1 ];
10          for  ( int  i  =  n  -   1 ; i   >   0 ; i -- {
11             result[i  -   1 =  i  *  coefficients[i];
12         }

13         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值