C#,数值计算——插值和外推,Base_interp的计算方法与源程序

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Abstract base class used by all interpolation routines in this chapter.
    /// Only the routine interp is called directly by the user.
    /// </summary>
    public abstract class Base_interp
    {
        public int n { get; set; }
        public int mm { get; set; }
        public int jsav { get; set; }
        public int cor { get; set; }
        public int dj { get; set; }
        public double[] xx { get; set; }
        public double[] yy { get; set; }

        /// <summary>
        /// Set up for interpolating on a table of x's and y's of length m. Normally
        /// called by a derived class, not by the user.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="m"></param>
        public Base_interp(double[] x, double y, int m)
        {
            this.n = x.Length;
            this.mm = m;
            this.jsav = 0;
            this.cor = 0;
            this.xx = x;
            this.yy = new double[x.Length];
            for (int i = 0; i < yy.Length; i++)
            {
                yy[i] = y;
            }
            dj = Math.Max(1, (int)Math.Pow((double)n, 0.25));
        }

        public double interp(double x)
        {
            int jlo = (cor != 0) ? hunt(x) : locate(x);
            return rawinterp(jlo, x);
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int locate(double x)
        {
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("locate size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int jl = 0;
            int ju = n - 1;
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int hunt(double x)
        {
            int jl = jsav;
            int inc = 1;
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("hunt size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int ju;
            if (jl < 0 || jl > n - 1)
            {
                jl = 0;
                ju = n - 1;
            }
            else
            {
                if (x >= xx[jl] == ascnd)
                {
                    for (; ; )
                    {
                        ju = jl + inc;
                        if (ju >= n - 1)
                        {
                            ju = n - 1;
                            break;
                        }
                        else if (x < xx[ju] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            jl = ju;
                            inc += inc;
                        }
                    }
                }
                else
                {
                    ju = jl;
                    for (; ; )
                    {
                        jl = jl - inc;
                        if (jl <= 0)
                        {
                            jl = 0;
                            break;
                        }
                        else if (x >= xx[jl] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            ju = jl;
                            inc += inc;
                        }
                    }
                }
            }
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        public abstract double rawinterp(int jlo, double x);

    }
}
 

2 代码格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Abstract base class used by all interpolation routines in this chapter.
    /// Only the routine interp is called directly by the user.
    /// </summary>
    public abstract class Base_interp
    {
        public int n { get; set; }
        public int mm { get; set; }
        public int jsav { get; set; }
        public int cor { get; set; }
        public int dj { get; set; }
        public double[] xx { get; set; }
        public double[] yy { get; set; }

        /// <summary>
        /// Set up for interpolating on a table of x's and y's of length m. Normally
        /// called by a derived class, not by the user.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="m"></param>
        public Base_interp(double[] x, double y, int m)
        {
            this.n = x.Length;
            this.mm = m;
            this.jsav = 0;
            this.cor = 0;
            this.xx = x;
            this.yy = new double[x.Length];
            for (int i = 0; i < yy.Length; i++)
            {
                yy[i] = y;
            }
            dj = Math.Max(1, (int)Math.Pow((double)n, 0.25));
        }

        public double interp(double x)
        {
            int jlo = (cor != 0) ? hunt(x) : locate(x);
            return rawinterp(jlo, x);
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int locate(double x)
        {
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("locate size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int jl = 0;
            int ju = n - 1;
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        /// <summary>
        /// Given a value x, return a value j such that x is (insofar as possible)
        /// centered in the subrange xx[j..j + mm - 1], where xx is the stored pointer.
        /// The values in xx must be monotonic, either increasing or decreasing.
        /// The returned value is not less than 0, nor greater than n-1.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public int hunt(double x)
        {
            int jl = jsav;
            int inc = 1;
            if (n < 2 || mm < 2 || mm > n)
            {
                throw new Exception("hunt size error");
            }
            bool ascnd = (xx[n - 1] >= xx[0]);
            int ju;
            if (jl < 0 || jl > n - 1)
            {
                jl = 0;
                ju = n - 1;
            }
            else
            {
                if (x >= xx[jl] == ascnd)
                {
                    for (; ; )
                    {
                        ju = jl + inc;
                        if (ju >= n - 1)
                        {
                            ju = n - 1;
                            break;
                        }
                        else if (x < xx[ju] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            jl = ju;
                            inc += inc;
                        }
                    }
                }
                else
                {
                    ju = jl;
                    for (; ; )
                    {
                        jl = jl - inc;
                        if (jl <= 0)
                        {
                            jl = 0;
                            break;
                        }
                        else if (x >= xx[jl] == ascnd)
                        {
                            break;
                        }
                        else
                        {
                            ju = jl;
                            inc += inc;
                        }
                    }
                }
            }
            while (ju - jl > 1)
            {
                int jm = (ju + jl) >> 1;
                if (x >= xx[jm] == ascnd)
                {
                    jl = jm;
                }
                else
                {
                    ju = jm;
                }
            }
            cor = Math.Abs(jl - jsav) > dj ? 0 : 1;
            jsav = jl;
            return Math.Max(0, Math.Min(n - mm, jl - ((mm - 2) >> 1)));
        }

        public abstract double rawinterp(int jlo, double x);

    }
}

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

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

相关文章

Digicert证书:您的网络安全守护神

在当今数字化的世界中&#xff0c;网络安全已经成为每一个企业和个人必须面对的问题。而Digicert品牌证书&#xff0c;就是您网络安全的最佳选择。它不仅具有强大的安全性和稳定性&#xff0c;还能广泛应用于各种场景&#xff0c;为您提供全方位的保护。 首先&#xff0c;我们要…

Paypal发布公开信,三月已过,PYUSD发展如何?

2023年8月8日&#xff0c;美国支付巨头Paypal正式宣布推出其稳定币PYUSD&#xff0c;成为美国传统大型金融机构发行稳定币的首家企业。 当时&#xff0c;正值美国SEC与加密交易所Coinbase、Binance的诉讼白热化&#xff0c;Paxos被迫停止发行BUSD的阶段&#xff0c;在此背景下&…

计算机网络———ipv6简解

文章目录 1.前言&#xff1a;2. ipv6简单分析&#xff1a;2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示&#xff1a;2.3. NDP&#xff1a;2.4. ipv6地址动态分配&#xff1a; 1.前言&#xff1a; 因特网地址分配组织)宣布将其最2011年2月3日&#xff0c;IANA (In…

从0开始学习JavaScript--JavaScript 循环与迭代详解

JavaScript中的循环和迭代是编写高效和灵活代码的关键。循环用于重复执行一段代码&#xff0c;而迭代则用于遍历数据结构。本文将深入研究JavaScript中常见的循环结构和迭代方法&#xff0c;并通过丰富的示例代码来帮助读者更好地理解和运用这些概念。 基本的for循环 for循环…

【微软技术栈】C#.NET 内存映射文件

本文内容 进程、视图和管理内存使用内存映射文件编程示例 内存映射文件包含虚拟内存中文件的内容。 借助文件和内存空间之间的这种映射&#xff0c;应用&#xff08;包括多个进程&#xff09;可以直接对内存执行读取和写入操作&#xff0c;从而修改文件。 可以使用托管代码访…

前端404页面的制作

1、背景 前端开发经常遇到输入路径不存在的问题&#xff0c;为此&#xff0c;把之前项目的404拿出来供大家参考。代码很简单&#xff0c;适合新手入手&#xff0c;效果如下&#xff1a; 2、代码引用的是element-plus框架 <template><div><el-result icon"…

String字符串性能优化的几种方案

原创/朱季谦 String字符串是系统里最常用的类型之一&#xff0c;在系统中占据了很大的内存&#xff0c;因此&#xff0c;高效地使用字符串&#xff0c;对系统的性能有较好的提升。 针对字符串的优化&#xff0c;我在工作与学习过程总结了以下三种方案作分享&#xff1a; 一.优…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…

上海亚商投顾:沪指低开低走 抖音概念股逆势爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指跌超1%&#xff0c;创业板指跌超1.8%。抖音概念股逆势爆发&#xff0c;佳…

Codewhisperer 使用评价

最近亚⻢逊推出了一款基于机器学习的 AI 编程助手 Amazon CodeWhisperer&#xff0c;可以实时提供代码建议。在编写代码时&#xff0c;它会自动根据现有的代码和注释给出建议。Amazon CodeWhisperer 与GitHub Copilot类似&#xff0c;主要的功能有: 代码补全注释和文档补全代码…

asp.net网上书店管理系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目

一、源码特点 asp.net网上书店管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 asp.net网上书店系统1 二、功能介绍 本系统使用Microsoft Visual Studio 2019为开发工具&#xff0c;SQL Server为…

【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 上篇文章【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】 下篇文章【ARM Trace32(劳特巴赫) 使用介绍 2.2 – TRACE32 进阶命令之 DIAG 弹框命令】 文章目录 1. TRACE32 Practice 语法1.…

UE基础篇七:特效

导语&#xff1a; 文末有工程地址&#xff0c;通过小游戏来学习特效 入门 下载项目&#xff0c;在文章最下面 按播放开始游戏。按住左键射击并使用W、A、S和D移动。 在本教程中&#xff0c;您将创建两个粒子效果。一个用于船舶的推进器&#xff0c;一个用于船舶爆炸时。要创…

filter - 常用滤镜效果(毛玻璃、图片阴影、图片褪色)

文章目录 filter 属性滤镜算法函数blur&#xff1a;高斯模糊hue-rotate&#xff1a;色相环contrast&#xff1a;对比度grayscale&#xff1a;灰度drop-shadow&#xff1a;图片阴影 常见的滤镜效果图片内容轮廓阴影毛玻璃图片黑白调整图片色相和对比度使元素或文字变圆润 filter…

租赁小程序|租赁系统一种新型的商业模式

租赁市场是一个庞大的市场&#xff0c;它由出租人和承租人组成&#xff0c;以及相关的中介机构和供应商等。随着经济的发展和人们对灵活性的需求增加&#xff0c;租赁市场也在不断发展和壮大。特别是在共享经济时代&#xff0c;租赁市场得到了进一步的推动和发展。租赁系统是一…

储能领域 / 通讯协议 / 技术栈 等专有名字集锦——主要收集一些储能领域的专有名词,以及相关的名词

目录 名词解释ModbusIOT设备通讯协议 CAN/ RS-485 储能术语电池管理系统Battery Management System&#xff0c;BMS电池相关知识拆解电池的构成逆变器 电池核心参数SOC 电池剩余容量 名词解释 英文中文biz layer业务层与业务层通信的服务CRC循环冗余校验&#xff08;CRC&#…

开发一款小程序游戏需要多少钱?

小程序游戏的开发成本因多种因素而异&#xff0c;无法提供具体的固定数字。以下是影响小程序游戏开发成本的一些关键因素&#xff1a; 游戏规模和复杂度&#xff1a; 小程序游戏可以是简单的休闲游戏&#xff0c;也可以是更复杂的策略游戏。规模和复杂度会影响开发所需的时间和…

软件测试入门:静态测试

什么是静态测试 顾名思义&#xff0c;这里的静态是指程序的状态&#xff0c;即在不执行代码的情况下检查软件应用程序中的缺陷。进行静态测试是为了仅早在开发的早期阶段发现程序缺陷&#xff0c;因为这样可以更快速地识别缺陷并低成本解决缺陷&#xff0c;它还有助于查找动态…

UE基础篇六:音频

导语: 通过实现一个小游戏,来学会音频,最后效果 入门 下载启动项目并解压缩。通过导航到项目文件夹并打开SkywardMuffin.uproject来打开项目。 按播放开始游戏。游戏的目标是在不坠落的情况下触摸尽可能多的云。单击鼠标左键跳到第一朵云。 游戏很放松,不是吗?为了强调…

【分布式】BASE理论详解

一、什么是BASE理论&#xff1f; BASE理论是对分布式系统设计和处理的一种理论指导&#xff0c;相对于ACID&#xff08;原子性、一致性、隔离性和持久性&#xff09;这一强一致性模型&#xff0c;BASE更强调在分布式系统中牺牲强一致性以获得可用性和性能的平衡。 BASE 理论是…