C#,码海拾贝(06)——连分式(Continued Fraction)曲线插值算法,《C#数值计算算法编程》源代码升级改进版

一、连分式法

连分式法是一种有理函数逼近法,其基本出发点是:将原型展开成连分式,然后截取前面几个起主要作用的偏系数构成简化模型,连分式法计算简便,拟合精度较高,是一种很有效的传递函数简化法。

Continued Fraction

In mathematicsa continued fraction is an expression obtained through an iterative process of representing a number as the sum of its integer part and the reciprocal of another numberthen writing this other number as the sum of its integer part and another reciprocaland so onIn a finite continued fraction (or terminated continued fraction), the iteration/recursion is terminated after finitely many steps by using an integer in lieu of another continued fraction.

在数学中,连分式是通过迭代过程获得的表达式,将一个数表示为其整数部分和另一个数的倒数的和,然后将该另一个数字写成其整数部分与另一个倒数的和,在有限的连续分数(或终止的连续分数)中,通过使用整数代替另一个连续分数,在有限多个步骤之后终止迭代/递归。

Continued fractions have been studied for over two thousand years, with one of the first recorded studies being that of Euclid around 300 BC (in his book Elements) when he used them to find the greatest common divisor of two integers (using what is known today as the Euclidean algorithm).

Since then, continued fractions have shown up in a variety of other areas, including, but not limited to,

rational approximations for real numbers
solving linear Diophantine equations
solving Pell's equation
approximating PI
 

连分式已经被研究了两千多年,最早有记录的研究之一是公元前300年左右的欧几里得(在他的《元素》一书中),当时他用它们来寻找两个整数的最大公约数(使用今天所说的欧几里得算法)。

从那时起,连分式已经出现在各种其他领域,包括但不限于,

  • 实数的有理逼近
  • 求解线性丢番图方程
  • 求解佩尔方程
  • 近似PI

二、改进代码

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>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        public static double Continued_Fraction(double[] x, double[] y, double t)
        {
            int n = x.Length;
            double z = 0.0;

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

            // 连分式插值
            int k = 0;
            int m = 0;
            if (n <= 8)
            {
                k = 0;
                m = n;
            }
            else if (t < x[4])
            {
                k = 0;
                m = 8;
            }
            else if (t > x[n - 5])
            {
                k = n - 8;
                m = 8;
            }
            else
            {
                k = 1;
                int j = n;

                while (j - k != 1)
                {
                    int i = (k + j) / 2;
                    if (t < x[i - 1])
                    {
                        j = i;
                    }
                    else
                    {
                        k = i;
                    }
                }
                k = k - 4;
                m = 8;
            }

            double[] b = new double[8];
            b[0] = y[k];
            for (int i = 2; i <= m; i++)
            {
                double h = y[i + k - 1];
                int w = 0;
                int j = 1;
                while ((w == 0) && (j <= i - 1))
                {
                    if (Math.Abs(h - b[j - 1]) < float.Epsilon)
                    {
                        w = 1;
                    }
                    else
                    {
                        h = (x[i + k - 1] - x[j + k - 1]) / (h - b[j - 1]);
                    }
                    j = j + 1;
                }

                b[i - 1] = h;

                if (w != 0)
                {
                    b[i - 1] = float.MaxValue;//  1.0e+35;
                }
            }

            z = b[m - 1];
            for (int i = m - 1; i >= 1; i--)
            {
                z = b[i - 1] + (t - x[i + k - 1]) / z;
            }
            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>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        public static double Continued_Fraction(double x0, double step, double[] y, double t)
        {
            double[] x = new double[y.Length];
            for (int i = 0; i < y.Length; i++, x0 += step)
            {
                x[i] = x0;
            }
            return Continued_Fraction(x, y, t);
        }
#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>
        /// <returns>指定的查指点t的函数近似值y=f(t)</returns>
        public static double Continued_Fraction(double x0, double step, double[] y, double t)
        {
            int n = y.Length;
            double z = 0.0;

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

            // 连分式插值
            int k = 0;
            int m = 0;
            if (n <= 8)
            {
                k = 0;
                m = n;
            }
            else if (t < (x0 + 4.0 * step))
            {
                k = 0;
                m = 8;
            }
            else if (t > (x0 + (n - 5) * step))
            {
                k = n - 8;
                m = 8;
            }
            else
            {
                k = (int)((t - x0) / step) - 3;
                m = 8;
            }

            double[] b = new double[8];
            b[0] = y[k];
            for (int i = 2; i <= m; i++)
            {
                double hh = y[i + k - 1];
                int l = 0;
                int j = 1;

                while ((l == 0) && (j <= i - 1))
                {
                    if (Math.Abs(hh - b[j - 1]) + 1.0 == 1.0)
                    {
                        l = 1;
                    }
                    else
                    {
                        double xi = x0 + (i + k - 1) * step;
                        double xj = x0 + (j + k - 1) * step;
                        hh = (xi - xj) / (hh - b[j - 1]);
                    }

                    j = j + 1;
                }

                b[i - 1] = hh;
                if (l != 0)
                {
                    b[i - 1] = float.MaxValue;// 1.0e+35;
                }
            }

            z = b[m - 1];
            for (int i = m - 1; i >= 1; i--)
            {
                z = b[i - 1] + (t - (x0 + (i + k - 1) * step)) / z;
            }
            return (z);
        }
#endif
    }
}

POWER BY 315SOFT.COM

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

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

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

相关文章

【Spring Cloud Alibaba】5.创建服务消费者(Feign)

文章目录简介什么是 Feign开始搭建创建项目修改POM文件添加启动类创建 Feign 接口添加Controller添加配置文件启动项目测试访问Nacos访问接口测试负载均衡通过终端启动多个服务提供者实例简介 接下来我们创建一个服务消费者&#xff0c;通过Feign来进行与服务提供者交互&#…

KDZD程控超低频高压发生器

一、产品概述 本产品接合了现代数字变频技术&#xff0c;采用微机控制&#xff0c;升压、降压、测量、保护自动化。由于电子化&#xff0c;所以体积小重量轻、大屏幕液晶显示&#xff0c;清晰直观、且能显示输出波形、打印试验报告。 设计指标符合《电力设备专用测试仪器通用…

SSM—【笔记】1.1Spring

Spring好处 简化开发&#xff0c;降低企业级开发的复杂性框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率 简化开发&#xff1a;1、IoC、2、AOP[2.1衍生出事务处理 ] 框架整合&#xff1a;MyBatis、Mybatis-plus、Struts、Struts2、Hibernat…

Android开发-Android常用组件-ToggleButton开关按钮 Switch开关

4.7 开关按钮ToggleButton和开关Switch 1.开关按钮ToggleButton 属性名 说明 android:disabledAlpha 设置按钮在禁用时的透明度 android:textOff 按钮没有被选中时显示的文字 android:textOn 按钮被选中时显示的文字 另外&#xff0c;除了这个我们还可以自己写个 selec…

Spring Cloud之一:注册与发现-Eureka工程的创建

系列目录&#xff08;持续更新。。。&#xff09; Spring Cloud&#xff1a;什么是微服务 Spring Cloud之一&#xff1a;注册与发现-Eureka工程的创建 Spring Cloud之二&#xff1a;服务提供者注册到Eureka Server Spring Cloud之三&#xff1a;Eureka Server添加认证 Spr…

SpringBoot(3)整合Mybatis

文章目录一、导入依赖二、编写配置文件三、在启动类上添加注解&#xff0c;表示mapper接口所在位置四、定义mapper接口五、定义mapper.xml映射文件六、service层七、controller层八、修改idea检查代码的严格程度一、导入依赖 <dependency><groupId>org.mybatis.spr…

华为OD机试题,用 Java 解【新员工座位安排系统】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:新员工座位安排系统 题目 工位…

Ganache 安装

一. 下载Ganache Ganache下载链接 根据系统选择对应安装文件 或者brew安装 brew install --cask ganache 二.打开app 点击quickstart 点击save按钮&#xff0c;保存workspace&#xff0c;此时已启动对应端口为7545 三.打开truffle项目&#xff0c;设置配置文件 我已初始化…

华为OD机试题,用 Java 解【卡片组成的最大数字】问题 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:卡片组成的最大数字 题目 小组…

大数据分析工具Power BI(七):DAX使用场景及常用函数

DAX使用场景及常用函数 Power BI中DAX函数非常多,功能非常强大,下面结合一些实际场景来讲解DAX一些常用的函数,这些场景包含求和、计数、相除、排序、累计、环比、同比,为了更方便后续的可视化展示数据,我们新创建可视化展示的页面,创建一个新表存储后续展示的度量值,具…

iptables-ipset仅允许国内访问---端口白名单

前言&#xff1a;境外肉鸡攻击有点多&#xff0c;并业务无境外访问需求&#xff0c;IDC机房网络防火墙无法实现8K多条的china大陆地址导入&#xff1b;为实现仅china大陆地址访问&#xff0c;在业务端口如这里的80&#xff0c;使用iptables防火墙ipset过滤实现访问控制,对于访问…

HttpMessageConverter

基本介绍 我们进行Web开发&#xff0c;但是前端传入的 JSON 数据到底是如何被解析成 Java 对象作为 API入参的&#xff0c;后端返回的结果又是如何把 Java 对象解析成 返回给前端的&#xff0c;在整个数据流转的过程中&#xff0c;这些工作都是由谁来完成的呢&#xff1f; 从…

【UML建模】类图 类与接口表示方式、关系、基数详解

文章目录1.概述2.类的表示方式2.1.类与接口2.2.属性、方法、访问权限3.类之间的关系3.1.继承与实现3.2.关联、聚合、组合3.2.1.用代码表达关联关系3.2.2.用代码表达组合关系3.2.3.用代码表达聚合关系3.3.依赖3.3.1.依赖关系的代码实现4.基数5.总结1.概述 在我们的日常学习、工…

斐波拉契数列,有人买了一对小兔子,已知小兔子一个月后长成大兔子,大兔子每个月生一对小兔子,问:两年(24个月)之后,他一共有几对兔子。

[01]斐波拉契数列&#xff0c;有人买了一对小兔子&#xff0c;已知小兔子一个月后长成大兔子&#xff0c;大兔子每个月生一对小兔子&#xff0c;问:两年(24个月)之后&#xff0c;他一共有几对兔子。 第i月份大兔子小兔子总兔子1011210131124213532565387851381382192113341034…

Qt 正则表达式匹配失败的一个原因

在Qt中做正则表达式时&#xff0c;遇到一个很坑爹的问题&#xff0c;还是经验不足导致。 在正则表达式中&#xff0c;有很多需要元字符&#xff0c;是需要使用普通字符加转义符号搭配使用的。比如\w&#xff0c;\s。对于这类字符&#xff0c;在Qt中使用时&#xff0c;对\再次进…

Prometheus监控实战系列二十:监控Kubernetes集群(下)

本文承接上篇&#xff0c;在本篇中我们会讲解Prometheus如何应用基于Kubernetes的服务发现功能&#xff0c;检索目标信息并进行监控。 在监控策略上&#xff0c;我们将混合使用白盒监控与黑盒监控两种模式&#xff0c;建立起包括基础设施(Node)、应用容器&#xff08;Docker)、…

【新】(2023Q2模拟题JAVA)华为OD机试 - 时间格式化

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:时间格式化 题目 运维工程师…

(一)人工智能应用--深度学习原理与实战--初识深度学习

认识人工智能、机器学习与深度学习的关系 人工智能(Artificial IntelLigence)诞生于20世纪50年代,其简洁定义为:让计算机自动完成通常由人类完成的智力任务。人工智能是一个综合性领域。最早期出现的预定义规则的专家系统(Expert System) -----由程序员精心设计出明确的规则…

Flink从入门到精通之-05 DataStream API

Flink从入门到精通之-05 DataStream API 我们在第 2 章介绍 Flink 快速上手时&#xff0c;曾编写过一个简单的词频统计&#xff08;WordCount&#xff09;程序&#xff0c;相信读者已经对 Flink 的编程方式有了基本的认识。接下来&#xff0c;我们就将开始大量的代码练习&…

基于springboot实现学生成绩管理系统【源码+论文】

16springboot学生成绩管理系统演示录像2022_o8mkp开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…