C#,数值计算——插值和外推,二维三次样条插值(Spline2D_interp)的计算方法与源程序

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// 二维三次样条插值
    /// Object for two-dimensional cubic spline interpolation on a matrix.Construct
    /// with a vector of x1 values, a vector of x2 values, and a matrix of tabulated
    /// function values yij.Then call interp for interpolated values.
    /// </summary>
    public class Spline2D_interp
    {
        private int[,] bcucof_wt = new int[,] {
            {  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 },
            {  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0 },
            { -3,  0,  0,  3,  0,  0,  0,  0, -2,  0,  0, -1,  0,  0,  0,  0 },
            {  2,  0,  0, -2,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0 },
            {  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
            {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0 },
            {  0,  0,  0,  0, -3,  0,  0,  3,  0,  0,  0,  0, -2,  0,  0, -1 },
            {  0,  0,  0,  0,  2,  0,  0, -2,  0,  0,  0,  0,  1,  0,  0,  1 },
            { -3,  3,  0,  0, -2, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
            {  0,  0,  0,  0,  0,  0,  0,  0, -3,  3,  0,  0, -2, -1,  0,  0 },
            {  9, -9,  9, -9,  6,  3, -3, -6,  6, -6, -3,  3,  4,  2,  1,  2 },
            { -6,  6, -6,  6, -4, -2,  2,  4, -3,  3,  3, -3, -2, -1, -1, -2 },
            {  2, -2,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
            {  0,  0,  0,  0,  0,  0,  0,  0,  2, -2,  0,  0,  1,  1,  0,  0 },
            { -6,  6, -6,  6, -3, -3,  3,  3, -4,  4,  2, -2, -2, -2, -1, -1 },
            {  4, -4,  4, -4,  2,  2, -2, -2,  2, -2, -2,  2,  1,  1,  1,  1 }
        };

        private int m { get; set; }
        private int n { get; set; }
        private double[,] y { get; set; }
        private double[] x1 { get; set; }
        private double[] yv { get; set; }
        private Spline_interp[] srp { get; set; }

        public Spline2D_interp(double[] x1v, double[] x2v, double[,] ym)
        {
            this.m = x1v.Length;
            this.n = x2v.Length;
            this.y = ym;
            this.yv = new double[m];
            this.x1 = x1v;
            this.srp = new Spline_interp[m];
            for (int i = 0; i < m; i++)
            {
                srp[i] = new Spline_interp(x2v, y[i, 0]);
            }
        }

        public double interp(double x1p, double x2p)
        {
            for (int i = 0; i < m; i++)
            {
                yv[i] = (srp[i]).interp(x2p);
            }
            Spline_interp scol = new Spline_interp(x1, yv);
            return scol.interp(x1p);
        }

        /// <summary>
        /// Given arrays y[0..3], y1[0..3], y2[0..3], and y12[0..3], containing the
        /// function, gradients, and cross-derivative at the four grid points of a
        /// rectangular grid cell(numbered counterclockwise from the lower left), and
        /// given d1 and d2, the length of the grid cell in the 1 and 2 directions,
        /// this routine returns the table c[0..3][0..3] that is used by routine bcuint
        /// for bicubic interpolation.
        /// </summary>
        /// <param name="y"></param>
        /// <param name="y1"></param>
        /// <param name="y2"></param>
        /// <param name="y12"></param>
        /// <param name="d1"></param>
        /// <param name="d2"></param>
        /// <param name="c"></param>
        private void bcucof(double[] y, double[] y1, double[] y2, double[] y12, double d1, double d2, double[,] c)
        { 
            //int[,] bcucof_wt = new int[16, 16]{ bcucof_wt_d };
            double d1d2 = d1 * d2;
            double[] cl = new double[16];
            double[] x = new double[16];

            for (int i = 0; i < 4; i++)
            {
                x[i] = y[i];
                x[i + 4] = y1[i] * d1;
                x[i + 8] = y2[i] * d2;
                x[i + 12] = y12[i] * d1d2;
            }
            for (int i = 0; i < 16; i++)
            {
                double xx = 0.0;
                for (int k = 0; k < 16; k++)
                {
                    xx += bcucof_wt[i, k] * x[k];
                }
                cl[i] = xx;
            }
            int l = 0;
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    c[i, j] = cl[l++];
                }
            }
        }

        /// <summary>
        /// Bicubic interpolation within a grid square.Input quantities are
        /// y, y1, y2, y12 (as described in bcucof); x1l and x1u, the lower and upper
        /// coordinates of the grid square in the 1 direction; x2l and x2u likewise for
        /// the 2 direction; and x1, x2, the coordinates of the desired point for the
        /// interpolation.The interpolated function value is returned as ansy, and the
        /// interpolated gradient values as ansy1 and ansy2.This routine calls bcucof.
        /// </summary>
        /// <param name="y"></param>
        /// <param name="y1"></param>
        /// <param name="y2"></param>
        /// <param name="y12"></param>
        /// <param name="x1l"></param>
        /// <param name="x1u"></param>
        /// <param name="x2l"></param>
        /// <param name="x2u"></param>
        /// <param name="x1"></param>
        /// <param name="x2"></param>
        /// <param name="ansy"></param>
        /// <param name="ansy1"></param>
        /// <param name="ansy2"></param>
        /// <exception cref="Exception"></exception>
        public void bcuint(double[] y, double[] y1, double[] y2, double[] y12, double x1l, double x1u, double x2l, double x2u, double x1, double x2, ref double ansy, ref double ansy1, ref double ansy2)
        {
            double d1 = x1u - x1l;
            double d2 = x2u - x2l;
            double[,] c = new double[4, 4];
            bcucof(y, y1, y2, y12, d1, d2, c);
            //if (x1u == x1l || x2u == x2l)
            if (Math.Abs(x1u - x1l) <= float.Epsilon || Math.Abs(x2u - x2l) <= float.Epsilon)
            {
                throw new Exception("Bad input in routine bcuint");
            }
            double t = (x1 - x1l) / d1;
            double u = (x2 - x2l) / d2;
            ansy = ansy2 = ansy1 = 0.0;
            for (int i = 3; i >= 0; i--)
            {
                ansy = t * ansy + ((c[i, 3] * u + c[i, 2]) * u + c[i, 1]) * u + c[i, 0];
                ansy2 = t * ansy2 + (3.0 * c[i, 3] * u + 2.0 * c[i, 2]) * u + c[i, 1];
                ansy1 = u * ansy1 + (3.0 * c[3, i] * t + 2.0 * c[2, i]) * t + c[1, i];
            }
            ansy1 /= d1;
            ansy2 /= d2;
        }

    }
}

2 代码格式

using System;namespace Legalsoft.Truffer
{/// <summary>/// 二维三次样条插值/// Object for two-dimensional cubic spline interpolation on a matrix.Construct/// with a vector of x1 values, a vector of x2 values, and a matrix of tabulated/// function values yij.Then call interp for interpolated values./// </summary>public class Spline2D_interp{private int[,] bcucof_wt = new int[,] {{  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0 },{  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0 },{ -3,  0,  0,  3,  0,  0,  0,  0, -2,  0,  0, -1,  0,  0,  0,  0 },{  2,  0,  0, -2,  0,  0,  0,  0,  1,  0,  0,  1,  0,  0,  0,  0 },{  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },{  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0 },{  0,  0,  0,  0, -3,  0,  0,  3,  0,  0,  0,  0, -2,  0,  0, -1 },{  0,  0,  0,  0,  2,  0,  0, -2,  0,  0,  0,  0,  1,  0,  0,  1 },{ -3,  3,  0,  0, -2, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },{  0,  0,  0,  0,  0,  0,  0,  0, -3,  3,  0,  0, -2, -1,  0,  0 },{  9, -9,  9, -9,  6,  3, -3, -6,  6, -6, -3,  3,  4,  2,  1,  2 },{ -6,  6, -6,  6, -4, -2,  2,  4, -3,  3,  3, -3, -2, -1, -1, -2 },{  2, -2,  0,  0,  1,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },{  0,  0,  0,  0,  0,  0,  0,  0,  2, -2,  0,  0,  1,  1,  0,  0 },{ -6,  6, -6,  6, -3, -3,  3,  3, -4,  4,  2, -2, -2, -2, -1, -1 },{  4, -4,  4, -4,  2,  2, -2, -2,  2, -2, -2,  2,  1,  1,  1,  1 }};private int m { get; set; }private int n { get; set; }private double[,] y { get; set; }private double[] x1 { get; set; }private double[] yv { get; set; }private Spline_interp[] srp { get; set; }public Spline2D_interp(double[] x1v, double[] x2v, double[,] ym){this.m = x1v.Length;this.n = x2v.Length;this.y = ym;this.yv = new double[m];this.x1 = x1v;this.srp = new Spline_interp[m];for (int i = 0; i < m; i++){srp[i] = new Spline_interp(x2v, y[i, 0]);}}public double interp(double x1p, double x2p){for (int i = 0; i < m; i++){yv[i] = (srp[i]).interp(x2p);}Spline_interp scol = new Spline_interp(x1, yv);return scol.interp(x1p);}/// <summary>/// Given arrays y[0..3], y1[0..3], y2[0..3], and y12[0..3], containing the/// function, gradients, and cross-derivative at the four grid points of a/// rectangular grid cell(numbered counterclockwise from the lower left), and/// given d1 and d2, the length of the grid cell in the 1 and 2 directions,/// this routine returns the table c[0..3][0..3] that is used by routine bcuint/// for bicubic interpolation./// </summary>/// <param name="y"></param>/// <param name="y1"></param>/// <param name="y2"></param>/// <param name="y12"></param>/// <param name="d1"></param>/// <param name="d2"></param>/// <param name="c"></param>private void bcucof(double[] y, double[] y1, double[] y2, double[] y12, double d1, double d2, double[,] c){ //int[,] bcucof_wt = new int[16, 16]{ bcucof_wt_d };double d1d2 = d1 * d2;double[] cl = new double[16];double[] x = new double[16];for (int i = 0; i < 4; i++){x[i] = y[i];x[i + 4] = y1[i] * d1;x[i + 8] = y2[i] * d2;x[i + 12] = y12[i] * d1d2;}for (int i = 0; i < 16; i++){double xx = 0.0;for (int k = 0; k < 16; k++){xx += bcucof_wt[i, k] * x[k];}cl[i] = xx;}int l = 0;for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){c[i, j] = cl[l++];}}}/// <summary>/// Bicubic interpolation within a grid square.Input quantities are/// y, y1, y2, y12 (as described in bcucof); x1l and x1u, the lower and upper/// coordinates of the grid square in the 1 direction; x2l and x2u likewise for/// the 2 direction; and x1, x2, the coordinates of the desired point for the/// interpolation.The interpolated function value is returned as ansy, and the/// interpolated gradient values as ansy1 and ansy2.This routine calls bcucof./// </summary>/// <param name="y"></param>/// <param name="y1"></param>/// <param name="y2"></param>/// <param name="y12"></param>/// <param name="x1l"></param>/// <param name="x1u"></param>/// <param name="x2l"></param>/// <param name="x2u"></param>/// <param name="x1"></param>/// <param name="x2"></param>/// <param name="ansy"></param>/// <param name="ansy1"></param>/// <param name="ansy2"></param>/// <exception cref="Exception"></exception>public void bcuint(double[] y, double[] y1, double[] y2, double[] y12, double x1l, double x1u, double x2l, double x2u, double x1, double x2, ref double ansy, ref double ansy1, ref double ansy2){double d1 = x1u - x1l;double d2 = x2u - x2l;double[,] c = new double[4, 4];bcucof(y, y1, y2, y12, d1, d2, c);//if (x1u == x1l || x2u == x2l)if (Math.Abs(x1u - x1l) <= float.Epsilon || Math.Abs(x2u - x2l) <= float.Epsilon){throw new Exception("Bad input in routine bcuint");}double t = (x1 - x1l) / d1;double u = (x2 - x2l) / d2;ansy = ansy2 = ansy1 = 0.0;for (int i = 3; i >= 0; i--){ansy = t * ansy + ((c[i, 3] * u + c[i, 2]) * u + c[i, 1]) * u + c[i, 0];ansy2 = t * ansy2 + (3.0 * c[i, 3] * u + 2.0 * c[i, 2]) * u + c[i, 1];ansy1 = u * ansy1 + (3.0 * c[3, i] * t + 2.0 * c[2, i]) * t + c[1, i];}ansy1 /= d1;ansy2 /= d2;}}
}

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

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

相关文章

矩阵元素求和:按行、按列、所有元素np.einsum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 矩阵元素求和&#xff1a; 按行、按列、所有元素 np.einsum() [太阳]选择题 下列说法正确的是&#xff1a; import numpy as np A np.array([[1, 2],[3, 4]]) print("【显示】A") p…

会话 cookie 及隐私的那些事

什么是会话 Cookie? 会话 Cookie 的概念非常简单。 会话 Cookie,也称为临时 Cookie 或内存 Cookie,是网站在浏览会话期间存储在用户计算机或设备上的小数据片段。 它是由网站生成并由您的浏览器存储和使用的多种 Cookie 之一。 常规 Cookie 或“持久”Cookie 是通常在您的…

Pandas实战:电商平台用户分析

数据分析 1.行为概况 首先&#xff0c;我们要对用户的行为类型有一定的理解&#xff0c;了解每个行为所代表的含义。 浏览&#xff1a;作为用户与商品接触的第一个行为&#xff0c;它的数量级与其他行为类型相比而言是非常庞大的&#xff0c;因为&#xff1a; 用户购买之前需…

Spring-Boot---项目创建和使用

文章目录 什么是Spring-Boot&#xff1f;Spring-Boot项目的创建使用Idea创建使用网页创建 项目目录介绍项目启动 什么是Spring-Boot&#xff1f; Spring的诞生是为了简化Java程序开发的&#xff1b;而Spring-Boot的诞生是为了简化Spring程序开发的。 Spring-Boot具有很多优点…

【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享

系列文章目录 分享一些fpga内使用riscv软核的经验&#xff0c;共大家参考。后续内容比较多&#xff0c;会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 前言 在efinix fpga中使用riscv是一…

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

实验六 单脉冲触发中断实验(汇编与微机原理)

实验目的&#xff1a; 掌握可编程中断控制器8259一般的使用方法。 掌握8259初始化的编程方法及中断服务程序的编写方法&#xff0c;中断程序的调试方法。 实验内容&#xff1a; 用单脉冲按钮的正脉冲输出作为中断控制器8259的中断源产生中断请求&#xff0c;在中断服务程序…

prometheus基础,结合node_exporter监控节点

文章目录 一、Prometheus是什么二、exporters是什么三、node_exporter四、安装 Prometheus 和 node_exporter下载运行 prometheus运行 node_exporter 五、配置 Prometheus 收集监控数据总结 一、Prometheus是什么 Prometheus 是一个开源的监控和警报工具&#xff0c;它记录任何…

Centos7安装docker、java、python环境

文章目录 前言一、docker的安装二、docker-compose的安装三、安装python3和配置pip3配置python软链接&#xff08;关键&#xff09; 四、Centos 7.6操作系统安装JAVA环境 前言 每次vps安装docker都要看网上的文章&#xff0c;而且都非常坑&#xff0c;方法千奇百怪&#xff0c…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…

【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应

运动物体的微多普勒效应为人体动作识别提供了可能&#xff0c;基于雷达的居家检测具有良好的隐私保护性&#xff0c;且不易受环境因素影响&#xff08;如光照、温度等&#xff09;&#xff0c;近年来已受到国内外学者的广泛关注。由于雷达信号的非平稳特性&#xff0c;通过短时…

Oracle-CDB容器数据库修改service_names踩坑

前言: 最近在对一套Oracle容器数据库进行迁移测试时&#xff0c;为了保持新环境与旧环境的服务名一致&#xff0c;需要在新环境添加旧环境的服务名&#xff0c;在CDB的根容器通过service_name参数添加旧环境的服务名之后&#xff0c;发现数据库PDB的服务名全部被注销&#xff0…

自动驾驶学习笔记(十四)——感知算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知算法 开发过程 测试和评价 前言…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Prop@Link@State状态装饰器(十二)

文章目录 一、哪些是状态装饰器二、StatePropLink状态传递的核心规则三、状态装饰器练习 一、哪些是状态装饰器 1、State&#xff1a;被装饰拥有其所属组件的状态&#xff0c;可以作为其子组件单向和双向同步的数据源。当其数值改变时&#xff0c;会引起相关组件的渲染刷新。 …

思维模型 赫洛克效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。及时反馈&#xff0c;激发动力。 1 赫洛克效应的应用 1.1 赫洛克效应在管理中的应用 美国惠普公司是一家全球知名的科技公司&#xff0c;该公司非常注重员工的激励和认可。在惠普公司&…

网络和Linux网络_9(应用层和传输层_笔试选择题)

目录 一. 常见应用协议等等 1. 以下不是合法HTTP请求方法的是( ) 2. 文件传输使用的协议是&#xff08;&#xff09; 3. HTTP1.1的请求方法不包括&#xff1f;() 4. http状态码中&#xff0c;( )表示访问成功&#xff0c;( )表示坏请求&#xff0c;( )表示服务不可用。() …

mysql的几种索引

mysql可以在表的一列、或者多列上创建索引&#xff0c;索引的类型可以选择&#xff0c;如下&#xff1a; 普通索引&#xff08;KEY&#xff09; 普通索引可以提高查询效率。在表的一列、或者多列上创建索引。 每个表可以创建多个普通索引。 例如&#xff0c;下面示例&#…

智能优化算法应用:基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于海洋捕食者算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海洋捕食者算法4.实验参数设定5.算法结果…

实现一个简单的网络通信下(udp)

时间过去好久了&#xff0c;先回忆一下上一篇博客的代码&#xff01;&#xff01; 目前来看&#xff0c;我们客户端发一条消息&#xff0c;我服务器收到这一条消息之后呢&#xff0c;服务器也知道了是谁给我发来的消息&#xff0c;紧接这就把这条消息放进buffer当中&#xff0c…