一维二阶切比雪夫多项式和二维二阶切比雪夫多项式
scala版参考:
http://hxfcalf.blog.163.com/blog/static/21575548201373124214412
http://hxfcalf.blog.163.com/blog/static/21575548201373152715780
何老师的版本中的问题是采用了Float作为数据的存储类型,但是由于Float的精度不够,导致二维二阶切比雪夫多项式结果不能收敛,
所以通过将数据类型修改为BigDecimal的方式解决了这个问题。
一维二阶切比雪夫多项式:
package chebList
import tools.BigDecimalTools
/**
* 一维2阶切比雪夫多项式
* gao
* 2015-08-04
*/
case class CbVal(I0: Int) {
val K0 = 2
//二阶切比雪夫多项式系数
val cb = new Array[Seq[BigDecimal]](K0 + 1)
for (k <- 0 to K0) cb(k) = k match{
case 0 => (1 to I0).map (x => BigDecimal.decimal(1.0))
case 1 => (1 to I0) map (x => BigDecimal.decimal(x - (I0 + 1.0) / 2.0))
case 2 => cb(1) map (x => x * x - (I0 * I0 - 1) / (4 * (4 - 1)))
}
//标准化处理后的二阶切比雪夫多项式系数
val v = new Array[Seq[BigDecimal]](K0 + 1)
def sq(v: Seq[BigDecimal]):BigDecimal = {
BigDecimalTools.bigSqrt(v.map(x => x * x).sum)
}
for (k <- (0 to K0).par) {
v(k) = cb(k).map(x => x / sq(cb(k)))
}
}
class D1Cheb(f: Array[BigDecimal]) extends CbVal(f.length) {
//一维要素的多项式权重
val A = new Array[BigDecimal](K0 + 1)
for (k <- (0 to K0).par) {
A(k)= v(k).zip(f).map(x => x._1 * x._2).sum
}
//一维要素拟合
val fit = new Array[BigDecimal](f.length)
for (i <- (0 until f.length).par){
fit(i) = Seq(v(0)(i),v(1)(i),v(K0)(i)).zip(A).map(x =>