C#,码海拾贝(08)——埃特金(Aitken)逐步曲线插值算法,《C#数值计算算法编程》源代码升级改进版

埃特金逐步线性插值法(Aitken successive linear interpolation method)一种能逐步升阶的插值方法.用拉格朗日插值多项式计算函数近似值时,如果精度不满足要求,需增加插值节点以提高插值多项式次数时,原来算出的结果均不能利用,必须重新计算.用埃特金逐步线性插值法能克服这一缺点。这个算法适用于计算机上计算,且具有自动选取节卢并逐步比较精度的特点,程序也较简单一般以斜结上两个相邻插值多项式的值之差满足所需精度作大计算过程终止标志。

 

Aitken Interpolation -- from Wolfram MathWorld Applied Mathematics Numerical Methods Approximation Theory Interpolation Aitken Interpolation An algorithm similar to Neville's algorithm for constructing the Lagrange interpolating polynomial

艾特肯插值——来自Wolfram MathWorld应用数学数值方法近似理论插值艾特肯插补一种类似于Neville算法的拉格朗日插值多项式构造算法。

AITKEN'S INTERPOLATION
Aitken's procedure yields systematically and successively better interpolation polynomials corresponding to successively higher order truncation of Newton's divided difference formula.

艾肯插值

Aitken程序系统地、连续地产生更好的插值多项式,对应于牛顿分差公式的连续高阶截断。

using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;

namespace Zhou.CSharp.Algorithm
{
    /// <summary>
    /// 插值计算类Interpolation.cs
    /// 作者:周长发
    /// 改编:深度混淆
    /// https://blog.csdn.net/beijinghorn
    /// </summary>
    public static partial class Interpolation
    {
        /// <summary>
        /// 埃特金不等距逐步插值
        /// </summary>
        /// <param name="x">一维数组,长度为n,存放给定的n个结点的值x(i),要求x(0)<x(1)<...<x(n-1)</param>
        /// <param name="y">一维数组,长度为n,存放给定的n个结点的函数值y(i),y(i) = f(x(i)), i=0,1,...,n-1</param>
        /// <param name="t">存放指定的插值点的x值</param>
        /// <param name="eps">控制精度参数</param>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        public static double Aitken(double[] x, double[] y, double t, double eps)
        {
            int n = x.Length;
            double z = 0.0;
            // 特例处理
            if (n < 1)
            {
                return (z);
            }
            if (n == 1)
            {
                z = y[0];
                return (z);
            }

            // 开始插值
            int m = 10;
            if (m > n)
            {
                m = n;
            }
            int k;
            if (t <= x[0])
            {
                k = 1;
            }
            else if (t >= x[n - 1])
            {
                k = n;
            }
            else
            {
                k = 1;
                int j = n;
                int l = 0;
                while ((k - j != 1) && (k - j != -1))
                {
                    l = (k + j) / 2;
                    if (t < x[l - 1])
                    {
                        j = l;
                    }
                    else
                    {
                        k = l;
                    }
                }
                if (Math.Abs(t - x[l - 1]) > Math.Abs(t - x[j - 1]))
                {
                    k = j;
                }
            }

            double[] xx = new double[10];
            double[] yy = new double[10];
            {
                int j = 1;
                int l = 0;
                for (int i = 1; i <= m; i++)
                {
                    k = k + j * l;
                    if ((k < 1) || (k > n))
                    {
                        l = l + 1;
                        j = -j;
                        k = k + j * l;
                    }

                    xx[i - 1] = x[k - 1];
                    yy[i - 1] = y[k - 1];
                    l = l + 1;
                    j = -j;
                }
            }

            {
                int i = 0;
                do
                {
                    i = i + 1;
                    z = yy[i];

                    for (int j = 0; j <= i - 1; j++)
                    {
                        z = yy[j] + (t - xx[j]) * (yy[j] - z) / (xx[j] - xx[i]);
                    }
                    yy[i] = z;
                } while ((i != m - 1) && (Math.Abs(yy[i] - yy[i - 1]) > eps));
            }

            return (z);
        }

        /// <summary>
        /// 埃特金等距逐步插值
        /// (使用非等距插值的方法)
        /// </summary>
        /// <param name="x0">存放等距n个结点中第一个结点的值</param>
        /// <param name="step">等距结点的步长</param>
        /// <param name="y">一维数组,长度为n,存放给定的n个结点的函数值y(i),y(i) = f(x(i)), i=0,1,...,n-1</param>
        /// <param name="t">存放指定的插值点的x值</param>
        /// <param name="eps">精算精度</param>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        public static double Aitken(double x0, double step, double[] y, double t, double eps)
        {
            double[] x = new double[y.Length];
            for (int i = 0; i < y.Length; i++, x0 += step)
            {
                x[i] = x0;
            }
            return Aitken(x, y, t, eps);
        }

#if __OLD__
        /// <summary>
        /// 埃特金等距逐步插值
        /// </summary>
        /// <param name="x0">等距n个结点中第一个结点的值</param>
        /// <param name="step">等距结点的步长</param>
        /// <param name="y">一维数组,长度为n,存放给定的n个结点的函数值y(i),y(i) = f(x(i)), i=0,1,...,n-1</param>
        /// <param name="t">存放指定的插值点的x值</param>
        /// <param name="eps">控制精度参数</param>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        /// <returns></returns>
        public static double Aitken(double x0, double step, double[] y, double t, double eps)
        {
            int n = y.Length;
            double z = 0.0;

            // 特例处理
            if (n < 1)
            {
                return (z);
            }
            else if (n == 1)
            {
                z = y[0];
                return (z);
            }

            // 开始插值
            int m = 10;
            if (m > n)
            {
                m = n;
            }
            int k = 0;
            if (t <= x0)
            {
                k = 1;
            }
            else if (t >= x0 + (n - 1) * step)
            {
                k = n;
            }
            else
            {
                k = 1;
                int j = n;
                int w = 0;
                while ((k - j != 1) && (k - j != -1))
                {
                    w = (k + j) / 2;
                    if (t < x0 + (w - 1) * step)
                    {
                        j = w;
                    }
                    else
                    {
                        k = w;
                    }
                }
                if (Math.Abs(t - (x0 + (w - 1) * step)) > Math.Abs(t - (x0 + (j - 1) * step)))
                {
                    k = j;
                }
            }

            double[] xx = new double[10];
            double[] yy = new double[10];
            {
                int j = 1;
                int w = 0;
                for (int i = 1; i <= m; i++)
                {
                    k = k + j * w;
                    if ((k < 1) || (k > n))
                    {
                        w = w + 1;
                        j = -j;
                        k = k + j * w;
                    }

                    xx[i - 1] = x0 + (k - 1) * step;
                    yy[i - 1] = y[k - 1];
                    w = w + 1;
                    j = -j;
                }
            }
            {
                int i = 0;
                do
                {
                    i = i + 1;
                    z = yy[i];
                    for (int j = 0; j <= i - 1; j++)
                    {
                        z = yy[j] + (t - xx[j]) * (yy[j] - z) / (xx[j] - xx[i]);
                    }
                    yy[i] = z;
                } while ((i != m - 1) && (Math.Abs(yy[i] - yy[i - 1]) > eps));
            }
            return (z);
        }
#endif
    }
}

POWER BY 315SOFT.COM

基于坐标点的计算,从点集计算插值曲线等拓展方法请参阅《拉格朗日插值算法及其拓展》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字节二面,原来我对自动化测试的理解太浅了

如果你入职一家新的公司&#xff0c;领导让你开展自动化测试&#xff0c;作为一个新人&#xff0c;你肯定会手忙脚乱&#xff0c;你会如何落地自动化测试呢&#xff1f; 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚&#xff0c;这样的人也是很悲…

七、网络安全

&#xff08;一&#xff09;网络安全设计 1、网络安全体系设计 &#xff08;1&#xff09;物理安全 通信线路的可靠性、硬软件设备的安全性、设备的备份、防灾害防干扰能力、设备的运行环境、不间断电源 eg机房安全 &#xff08;2&#xff09;系统安全 操作系统本身的缺陷…

vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】

文章目录4.完成非路由组件Header与Footer业务4.1使用组件的步骤&#xff08;非路由组件&#xff09;本人其他相关文章链接4.完成非路由组件Header与Footer业务 在咱们项目开发中&#xff0c;不在以HTML CSS 为主&#xff0c;主要搞业务、逻辑 开发项目的流程&#xff1a; (1)…

模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)

模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09; 文章目录模式识别 —— 第六章 支持向量机&#xff08;SVM&#xff09;与核&#xff08;Kernel&#xff09;硬间隔&#xff08;Hard-Margin&#xff09;软间隔&#xff08;Soft…

52LeetCode刷题_LeetCode刷题手册

虽然刷题一直饱受诟病&#xff0c;不过不可否认刷题确实能锻炼我们的编程能力&#xff0c;相信每个认真刷题的人都会有体会。现在提供在线编程评测的平台有很多&#xff0c;比较有名的有 hihocoder&#xff0c;LintCode&#xff0c;以及这里我们关注的 LeetCode。 LeetCode收录…

Spring 注解和 XML 配置文件重复定义 Bean,会怎样?

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

iPhone屏幕适配(之屏幕尺寸)

Device screen size 各设备屏幕尺寸 DeviceDimensions (portrait)iPhone 14 Pro Max430x932 pt (1290x2796 px 3x)iPhone 14 Pro393x852 pt (1179x2556 px 3x)iPhone 14 Plus428x926 pt (1284x2778 px 3x)iPhone 14390x844 pt (1170x2532 px 3x)iPhone 13 Pro Max428x926 pt (…

Element Plus 实例详解(七)___Typography 排版

Element Plus 实例详解&#xff08;七&#xff09;___Typography 排版 目录 一、前言 二、搭建Element Plus试用环境 1、搭建Vue3项目&#xff08;基于Vite Vue&#xff09; 2、安装Element Plus 三、Element Plus Typography 排版功能试用 1、字号 2、行高 3、Font-fam…

C语言:位运算符----与(),或(|),非(~),异或(^),左移(<<)和右移(>>)

C语言 基础开发----目录 一、位运算符----简介 位运算符 就是按二进制位进行运算。 C语言中位运算符主要包括六种&#xff0c;具体如下&#xff1a; 与(&)&#xff0c;或(|)&#xff0c;非(~)&#xff0c;异或(^)&#xff0c;左移(<<)和右移(>>) 位运算符含…

【C++】类和对象(三)

类和对象&#xff08;三&#xff09; 拷贝构造函数&#xff1a; 当我们想要将一个已确定的类变量的值拷贝给另外一个相同类型的类变量&#xff0c;有什么快捷的方法吗&#xff1f; 就相当于定义了一个int类型的i10&#xff0c;想将i复制给一个刚初始化的遍历j&#xff0c;in…

2022国赛E题完整成品文章数据代码模型--小批量物料的生产安排

基于LSTM循环神经网络的小批量物料生产安排分析 摘要 某电子产品制造企业面临以下问题&#xff1a;在多品种小批量的物料生产中&#xff0c;事先无法知道物料的 实际需求量。企业希望运用数学方法&#xff0c;分析已有的历史数据&#xff0c;建立数学模型&#xff0c;帮助企业…

优化测试生命周期行之有效的三种方法

确保软件质量和按时交付产品的最有效方法是什么&#xff1f;对于公司来说&#xff0c;无缺陷地为客户带来价值是一件重要的事情。随着软件开发生命周期变得越来越复杂&#xff0c;测试可能成为拖慢整个过程的瓶颈。为了加速它&#xff0c;创建了组织可以采用的多种策略和方法。…

python面向对象编程

&#x1f42c;在本次的博客当中我们要学习的是在python语言当中的面向对象的编程。我们之前学过的C语言是面向对象的编程。面向过程&#xff0c;其实就是面向着具体的每一个步骤和过程&#xff0c;把每一个步骤和过程完成&#xff0c;然后由这些功能方法相互调用&#xff0c;完…

Go语言精修(尚硅谷笔记)第十七和十八章

十七、反射 17.1 基本介绍 1 ) 反射可以在运行时动态获取变量的各种信息, 比如变量的类型(type)&#xff0c;类别(kind) 2 ) 如果是结构体变量&#xff0c;还可以获取到结构体本身的信息(包括结构体的字段、方法) 3 ) 通过反射&#xff0c;可以修改变量的值&#xff0c;可以…

react脚手架

一、首先了解一下react脚手架 .xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 a.包含了所有需要的配置&#xff08;语法检查、jsx编译devServer…&#xff09; b.下载好了所有相关的依赖 c.可以直接运行一个简单效果react提供了一个用于创建react项目的脚手架库:…

LLaMA:Open and Efficient Foundation Language Models

LLaMA&#xff1a;Open and Efficient Foundation Language ModelsIntroductionApproachPre-training DataArchitectureIntroduction 在大规模数据下训练的大模型&#xff0c;已经展示了很好的表现&#xff0c;当模型足够大的时&#xff0c;模型会出现一个涌现的能力&#xff…

Chapter8.3:控制系统校正的根轨迹法

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

区块链技术之密码学

密码学是研究编制密码和破译密码的技术科学&#xff0c;研究密码变化的客观规律&#xff0c;应用于编制密码以保守通信秘密的&#xff0c;成为编码学&#xff1b;应用于破译密码以获取通信情报的&#xff0c;称为破译学&#xff0c;总称密码学。在区块链中重要问题之一就是区块…

锁 一、锁的分类 1.1 可重入锁、不可重入锁 Java中提供的synchronized&#xff0c;ReentrantLock&#xff0c;ReentrantReadWriteLock都是可重入锁。 重入&#xff1a;当前线程获取到A锁&#xff0c;在获取之后尝试再次获取A锁是可以直接拿到的。 不可重入&#xff1a;当前…

Eclipse下载使用手册

Eclipse下载使用手册 目录Eclipse下载使用手册Eclipse的介绍与安装Eclipse简介Eclipse的下载Eclipse的解压Eclipse的介绍与安装 Eclipse简介 Eclipse 是一个开放源代码的&#xff0c;基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE)&#xff0c;可以通过安…