二阶切比雪夫多项式实现(scala版、python版)

本文介绍了如何使用Scala和Python实现一维及二维二阶切比雪夫多项式,特别强调了在Scala版本中遇到的浮点数精度问题,以及通过改用BigDecimal类型来确保结果准确收敛的解决方案。Python版本基于Scala版本进行了改进,同样实现了良好的收敛性。
摘要由CSDN通过智能技术生成

一维二阶切比雪夫多项式和二维二阶切比雪夫多项式

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 =>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值