C#常用数学插值法

目录

1、分段线性插值

2、三次样条插值

3、拉格朗日插值

(1)一元全区间不等距插值

(2)一元全区间等距插值

4、埃尔米特插值

(1)埃尔米特不等距插值

(2)埃尔米特等距插值


1、分段线性插值

        /// <summary>  /// 分段线性插值,将一组数插值为所需点数  /// </summary>  /// <param name="dataIn">待插值的数据数组</param>  /// <param name="n">插值点数</param>  /// <returns>插值后的数据数组</returns>  public static float[] Interpolation(float[] dataIn, int n){float[] dataOut = new float[n];int lenIn = dataIn.Length;float[] a = new float[lenIn];float[] divIn = new float[lenIn];float[] divOut = new float[n];divIn[0] = 0;for (int i = 1; i < lenIn; i++){divIn[i] = divIn[i - 1] + 1;}divOut[0] = 0;for (int i = 1; i < n; i++){divOut[i] = divOut[i - 1] + lenIn / (float)n;}int k = 0;for (int i = k; i < n; i++){for (int j = 0; j < lenIn - 1; j++){if (divOut[i] >= divIn[j] && divOut[i] < divIn[j + 1]){dataOut[i] = (dataIn[j + 1] - dataIn[j]) * (divOut[i] - divIn[j]) / (divIn[j + 1] - divIn[j]) + dataIn[j];k = i;}}}return dataOut;}

2、三次样条插值

三次样条插值 C#代码实现_c# 三次样条插值_Big_潘大师的博客-CSDN博客

        /// <summary>/// 三次样条插值/// </summary>/// <param name="points">排序好的x、y点集合</param>/// <param name="xs">输入x轴数据,插值计算出对应的y轴点</param>/// <param name="chf">写1</param>/// <returns>返回计算好的Y轴数值</returns>public static double[] SplineInsertPoint(PointClass[] points, double[] xs, int chf){int plength = points.Length;double[] h = new double[plength];double[] f = new double[plength];double[] l = new double[plength];double[] v = new double[plength];double[] g = new double[plength];for (int i = 0; i < plength - 1; i++){h[i] = points[i + 1].x - points[i].x;f[i] = (points[i + 1].y - points[i].y) / h[i];}for (int i = 1; i < plength - 1; i++){l[i] = h[i] / (h[i - 1] + h[i]);v[i] = h[i - 1] / (h[i - 1] + h[i]);g[i] = 3 * (l[i] * f[i - 1] + v[i] * f[i]);}double[] b = new double[plength];double[] tem = new double[plength];double[] m = new double[plength];double f0 = (points[0].y - points[1].y) / (points[0].x - points[1].x);double fn = (points[plength - 1].y - points[plength - 2].y) / (points[plength - 1].x - points[plength - 2].x);b[1] = v[1] / 2;for (int i = 2; i < plength - 2; i++){// Console.Write(" " + i);b[i] = v[i] / (2 - b[i - 1] * l[i]);}tem[1] = g[1] / 2;for (int i = 2; i < plength - 1; i++){//Console.Write(" " + i);tem[i] = (g[i] - l[i] * tem[i - 1]) / (2 - l[i] * b[i - 1]);}m[plength - 2] = tem[plength - 2];for (int i = plength - 3; i > 0; i--){//Console.Write(" " + i);m[i] = tem[i] - b[i] * m[i + 1];}m[0] = 3 * f[0] / 2.0;m[plength - 1] = fn;int xlength = xs.Length;double[] insertRes = new double[xlength];for (int i = 0; i < xlength; i++){int j = 0;for (j = 0; j < plength; j++){if (xs[i] < points[j].x)break;}j = j - 1;Console.WriteLine(j);if (j == -1 || j == points.Length - 1){if (j == -1)throw new Exception("插值下边界超出");if (j == points.Length - 1 && xs[i] == points[j].x)insertRes[i] = points[j].y;elsethrow new Exception("插值下边界超出");}else{double p1;p1 = (xs[i] - points[j + 1].x) / (points[j].x - points[j + 1].x);p1 = p1 * p1;double p2; p2 = (xs[i] - points[j].x) / (points[j + 1].x - points[j].x);p2 = p2 * p2;double p3; p3 = p1 * (1 + 2 * (xs[i] - points[j].x) / (points[j + 1].x - points[j].x)) * points[j].y + p2 * (1 + 2 * (xs[i] - points[j + 1].x) / (points[j].x - points[j + 1].x)) * points[j + 1].y;double p4; p4 = p1 * (xs[i] - points[j].x) * m[j] + p2 * (xs[i] - points[j + 1].x) * m[j + 1];//         Console.WriteLine(m[j] + " " + m[j + 1] + " " + j);p4 = p4 + p3;insertRes[i] = p4;//Console.WriteLine("f(" + xs[i] + ")= " + p4);}}//Console.ReadLine();return insertRes;}

排序计算

     public class PointClass{public double x = 0;public double y = 0;public PointClass(){x = 0; y = 0;}//-------写一个排序函数,使得输入的点按顺序排列,是因为插值算法的要求是,x轴递增有序的---------public static PointClass[] DeSortX(PointClass[] points){int length = points.Length;double temx, temy;for (int i = 0; i < length - 1; i++){for (int j = 0; j < length - i - 1; j++)if (points[j].x > points[j + 1].x){temx = points[j + 1].x;points[j + 1].x = points[j].x;points[j].x = temx;temy = points[j + 1].y;points[j + 1].y = points[j].y;points[j].y = temy;}}return points;}}

3、拉格朗日插值

(1)一元全区间不等距插值

        /// <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 Lagrange(double[] x, double[] y, double t){// x,y点数int n = x.Length;double z = 0.0;// 特例处理if (n < 1){return (z);}else if (n == 1){z = y[0];return (z);}else if (n == 2){z = (y[0] * (t - x[1]) - y[1] * (t - x[0])) / (x[0] - x[1]);return (z);}// 开始插值int ik = 0;while ((x[ik] < t) && (ik < n)){ik = ik + 1;}int k = ik - 4;if (k < 0){k = 0;}int m = ik + 3;if (m > n - 1){m = n - 1;}for (int i = k; i <= m; i++){double s = 1.0;for (int j = k; j <= m; j++){if (j != i){// 拉格朗日插值公式s = s * (t - x[j]) / (x[i] - x[j]);}}z = z + s * y[i];}return (z);}
         /// <summary>/// 一元全区间不等距插值/// </summary>/// <param name="points">点集(含XY坐标)</param>/// <param name="t"></param>/// <returns></returns>public static double Lagrange(PointF[] points, double t){double[] x = new double[points.Length];double[] y = new double[points.Length];for (int i = 0; i < points.Length; i++){x[i] = points[i].X;y[i] = points[i].Y;}return Lagrange(x, y, t);}
        /// <summary>/// 一元全区间不等距插值/// </summary>/// <param name="points">二元组类型的点集(含XY坐标)</param>/// <param name="t"></param>/// <returns></returns>public static double Lagrange(List<Tuple<double, double>> points, double t){double[] x = new double[points.Count];double[] y = new double[points.Count];for (int i = 0; i < points.Count; i++){x[i] = points[i].Item1;y[i] = points[i].Item2;}return Lagrange(x, y, t);}
        /// <summary>/// 一元全区间不等距插值,获得插值后的曲线(折线拟合)数据/// </summary>/// <param name="points">点集(含XY坐标)</param>/// <param name="segment_count">每数据段的分割数</param>/// <returns></returns>public static PointF[] Lagrange_Curve(PointF[] points, int segment_count = 10){int n = points.Length;PointF[] segments = new PointF[n * segment_count + 1];for (int i = 0; i < points.Length - 1; i++){double dt = (points[i + 1].X - points[i].X) / segment_count;double t = points[i].X;for (int j = 0; j <= segment_count; j++, t += dt){PointF p = new PointF(0.0F, 0.0F);p.X = (float)t;if (j == 0) p.Y = points[i].Y;else if (j == segment_count) p.Y = points[i + 1].Y;else p.Y = (float)(Lagrange(points, t));segments[i] = p;}}return segments;}
         /// <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 Lagrange(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 Lagrange(x, y, t);}

(2)一元全区间等距插值

        /// <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 Lagrange_Equidistant(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);}else if (n == 2){z = (y[1] * (t - x0) - y[0] * (t - x0 - step)) / step;return (z);}// 开始插值int ik = 0;if (t > x0){double p = (t - x0) / step;ik = (int)p;double q = (float)ik;if (p > q){ik = ik + 1;}}else{ik = 0;}int k = ik - 4;if (k < 0){k = 0;}int m = ik + 3;if (m > n - 1){m = n - 1;}for (int i = k; i <= m; i++){double s = 1.0;double xi = x0 + i * step;for (int j = k; j <= m; j++){if (j != i){double xj = x0 + j * step;// 拉格朗日插值公式s = s * (t - xj) / (xi - xj);}}z = z + s * y[i];}return (z);}

4、埃尔米特插值

(1)埃尔米特不等距插值

        /// <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="dy">一维数组,长度为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 Hermite(double[] x, double[] y, double[] dy, double t){int n = x.Length;double z = 0.0;// 循环插值for (int i = 1; i <= n; i++){double s = 1.0;for (int j = 1; j <= n; j++){if (j != i){s = s * (t - x[j - 1]) / (x[i - 1] - x[j - 1]);}}s = s * s;double p = 0.0;for (int j = 1; j <= n; j++){if (j != i){p = p + 1.0 / (x[i - 1] - x[j - 1]);}}double q = y[i - 1] + (t - x[i - 1]) * (dy[i - 1] - 2.0 * y[i - 1] * p);z = z + q * s;}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="dy">一维数组,长度为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 Hermite(double x0, double step, double[] y, double[] dy, double t){double[] x = new double[y.Length];for (int i = 0; i < y.Length; i++, x0 += step){x[i] = x0;}return Hermite(x, y, dy, t);}

(2)埃尔米特等距插值

        /// <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="dy">一维数组,长度为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 Hermite(double x0, double step, double[] y, double[] dy, double t){int n = y.Length;double z = 0.0;// 循环插值for (int i = 1; i <= n; i++){double s = 1.0;double q = x0 + (i - 1) * step;double p;for (int j = 1; j <= n; j++){p = x0 + (j - 1) * step;if (j != i){s = s * (t - p) / (q - p);}}s = s * s;p = 0.0;for (int j = 1; j <= n; j++){if (j != i){p = p + 1.0 / (q - (x0 + (j - 1) * step));}}q = y[i - 1] + (t - q) * (dy[i - 1] - 2.0 * y[i - 1] * p);z = z + q * s;}return (z);}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql安装教程保姆级

MySQL免安装本地运行 1.下载MySQL2.创建install.bat3.init.sql 初始创建4.环境变量配置5.运行 install.bat 管理员权限运行6.连接成功遇到的问题 1.下载MySQL ①地址&#xff1a;https://downloads.mysql.com/archives/community/ ②解压 2.创建install.bat 放在mysql>b…

【SpringBoot笔记37】SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket

这篇文章,主要介绍SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket。 目录 一、基于注解集成WebSocket 1.1、WebSocket常见注解 1.2、创建WebSocket服务端 1.3、配置ServerEndpointExpor

java数据算法-汉诺塔

1、有三根相邻的柱子&#xff0c;标号为A,B,C。 2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。 3、现在把所有盘子一个一个移动到柱子C上&#xff0c;并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。 题解步骤 1、当n1时&#xff1b; 将1号从A移动到C即…

算法综合篇专题一:双指针问题

"就算没有看清那株灿烂的花蕊&#xff0c;也应该放声歌颂赞美鲜红的玫瑰" 1、移动零 (1) 题目解析 (2) 算法原理 class Solution { public:void moveZeroes(vector<int>& nums) {for(int cur0,dest-1;cur<nums.size();cur){if(nums[cu…

AcWing 4908.饥饿的牛

原题链接&#xff1a;AcWing 4908.饥饿的牛 题目来源&#xff1a;夏季每日一题2023 贝茜是一头饥饿的牛。 每天晚上&#xff0c;如果牛棚中还有干草的话&#xff0c;贝茜都会吃掉其中的一捆。 初始时&#xff0c;牛棚中没有干草。 为了让贝茜不被饿死&#xff0c;农夫约翰制…

AOJ 2200 Mr. Rito Post Office 最短路径+动态规划+谨慎+思维

我写了好多注释&#xff0c;一看就能看懂&#xff0c;这个题目我想了6&#xff0c;7个小时&#xff0c;一开始忽略了船的位置和要把船安置的位置一致的情况&#xff0c;补上就对了。 #include <iostream> using namespace std; int inf 0x3f3f3f3f, num[1007], dp[1007…

Ansible-roles

Ansible-roles 一、roles作用 把playbook剧本里的各个play看作为角色&#xff0c;将各个角色的tasks任务、vars变量、templates模板、files文件等内容放置到角色的目录中统一管理&#xff0c;需要的时候可在playbook中直接使用roles调用&#xff0c;所以roles可以实现playboo…

实验报告6-利用Modelsim搭建一个UVM验证平台并跑通程序显示波形

实验报告6-利用Modelsim搭建一个UVM验证平台并跑通程序显示波形 1,背景知识2,搭建一个UVM验证平台3,确定几个重要组件的代码,全部都是.sv文件。(1)确定了行为,写interface文件:pkt_if.sv,代码如下:(2)pkt_data.sv(3)pkt_drv.sv(4)pkt_gen.sv(5)environment.s…

【微信小程序】引入第三方库poke对GZIP压缩数据进行解压

使用 npm 包管理工具&#xff1a; 首先&#xff0c;在小程序的根目录下执行 npm init 初始化项目&#xff0c;生成 package.json 文件。然后&#xff0c;通过 npm 安装 pako&#xff1a;npm install pako。接下来&#xff0c;在小程序的根目录下创建一个名为 miniprogram_npm 的…

java设计模式-建造者(Builder)设计模式

介绍 Java的建造者&#xff08;Builder&#xff09;设计模式可以将产品的内部表现和产品的构建过程分离开来&#xff0c;这样使用同一个构建过程来构建不同内部表现的产品。 建造者设计模式涉及如下角色&#xff1a; 产品&#xff08;Product&#xff09;角色&#xff1a;被…

前端工程化最佳实践:项目结构、代码规范和文档管理

文章目录 前端工程化最佳实践项目结构设计与组织文档管理和注释规范国际化和本地化实践 前端工程化的未来发展趋势前端工程化领域的最新技术和工具WebAssembly 和前端性能优化可持续性和可访问性的趋势 总结前端工程化的关键知识点前端工程化对项目和团队的价值 前端工程化最佳…

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录 1. 概述1.1 目的1.2 实现方式 2. 代码示例2.1 设计2.2 代码 1. 概述 1.1 目的 保证类只有一个实例有方法能让外部访问到该实例 1.2 实现方式 懒汉式 在第一次调用单例对象时创建该对象&#xff0c;这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象…

卷积神经网络

目录 注意&#xff1a;有参数计算的才叫层 1.应用 1.1分类和检索 1.2超分辨率重构 1.3医学任务 1.4无人驾驶 1.5人脸识别 2.卷积 2.1卷积神经网络和传统网络的区别 2.2整体框架 2.3理解卷积&#xff08;重点&#xff09; 2.4为何要进行多层卷积 2.5卷积核的参数 2.6…

C++STL库中的list

文章目录 list的介绍及使用 list的常用接口 list的模拟实现 list与vector的对比 一、list的介绍及使用 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向带头循环链表结构&#xff0c;双向带头循…

HDFS 分布式存储 spark storm HBase

HDFS 分布式存储 spark storm HBase 分布式结构 master slave name node client 负责文件的拆分 128MB 3份 data node MapReduce 分布式计算 离线计算 2.X之前 速度比较慢 对比spark 编程思想 Map 分 Reduce 合 hadoop streaming Mrjob Yarn 资源管理 cpu 内存 MapReduc…

NoSQL———Redis配置与优化

目录 一、关系数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3 关系型数据库和非关系型数据库区别 1.3.1 非关系型数据库产生背景 二、Redis简介 2.1 redis优点&#xff1a; 三、Redis 安装部署 四、Redis 命令工具 4.1 redis-cli 命令行工具 …

vue3代码编辑器组件codemirror-editor-vue3

官方文档&#xff1a;https://github.com/RennCheung/codemirror-editor-vue3 国内镜像&#xff1a;https://renncheung.github.io/codemirror-editor-vue3/zh-CN/guide/getting-started 1.安装 npm install codemirror-editor-vue3 codemirror5.x -S2.代码示例 <templat…

mybatis框架遇到的问题:All elements are null

今天在做一个查询接口&#xff0c;应用场景是统计选择日期范围内的每日数据量&#xff0c;于是便想到了使用count&#xff08;&#xff09;函数来统计总行数来代表数据量&#xff0c;并且以记录时间的字段来作为分组标准&#xff08;group by&#xff09;&#xff0c;大体思路有…

基于ssm+mysql+jsp高校疫情防控出入信息管理系统

基于ssmmysqljsp高校疫情防控出入信息管理系统 一、系统介绍二、功能展示1.登陆2.教师管理3.学生管理4.打卡记录管理5.学生申请通行证6.通行证管理7.留言信息管理8.公告类型管理9.公告管理 四、获取源码 一、系统介绍 学生 : 个人中心、打卡记录管理、学生申请通行证、通行证管…

Delphi XE的原生JSONObject如何判断键值是否存在?

【问题现象】 Delphi XE的原生JSONObject&#xff0c;取出键值的时候如下&#xff1a; //json是传入的参数&#xff0c;里面包括"food_name"等之类的键值&#xff0c;没有food_type键值 procedure XXXXFunciton(json:TJSONObject) var strFoodName,strFoodType:S…