C#,数值计算——插值和外推,曲线插值(Curve_interp)的计算方法与源程序

news2024/11/20 0:31:07

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for interpolating a curve specified by n points in dim dimensions.
    /// </summary>
    public class Curve_interp
    {
        private int dim { get; set; }
        private int n { get; set; }
        private int xin { get; set; }
        private bool cls { get; set; }
        private double[,] pts { get; set; }
        private double[] s { get; set; }
        private double[] ans { get; set; }
        private Spline_interp[] srp { get; set; }// = new Spline_interp[];

        /// <summary>
        /// The n x dim matrix ptsin inputs the data points.Input close as 0 for an
        /// open curve, 1 for a closed curve. (For a closed curve, the last data point
        /// should not duplicate the first 鈥?the algorithm will connect them.)
        /// </summary>
        /// <param name="ptsin"></param>
        /// <param name="close"></param>
        /// <exception cref="Exception"></exception>
        public Curve_interp(double[,] ptsin, bool close = false)
        {
            this.n = ptsin.GetLength(0);
            this.dim = ptsin.GetLength(1);
            this.xin = close ? 2 * n : n;
            this.cls = close;
            this.pts = new double[dim, xin];
            this.s = new double[xin];
            this.ans = new double[dim];
            this.srp = new Spline_interp[dim];

            //int i;
            //int ii;
            //int im;
            //int j;
            //int ofs;
            //double ss;
            //double soff;
            //double db;
            //double de;
            int ofs = close ? n / 2 : 0;
            s[0] = 0.0;
            for (int i = 0; i < xin; i++)
            {
                int ii = (i - ofs + n) % n;
                int im = (ii - 1 + n) % n;
                for (int j = 0; j < dim; j++)
                {
                    pts[j, i] = ptsin[ii, j];
                }
                if (i > 0)
                {
                    //s[i] = s[i - 1] + rad(ptsin.GetRow(ii).ToArray(), ptsin.GetRow(im).ToArray());
                    s[i] = s[i - 1] + Globals.dist(Globals.CopyFrom(ii, ptsin), Globals.CopyFrom(im, ptsin));
                    if (s[i] == s[i - 1])
                    {
                        throw new Exception("error in Curve_interp");
                    }
                }
            }
            double ss = close ? s[ofs + n] - s[ofs] : s[n - 1] - s[0];
            double soff = s[ofs];
            for (int i = 0; i < xin; i++)
            {
                s[i] = (s[i] - soff) / ss;
            }
            for (int j = 0; j < dim; j++)
            {
                double db = xin < 4 ? 1.0e99 : fprime(s, 0, Globals.CopyFrom(j, pts), 0, 1);
                double de = xin < 4 ? 1.0e99 : fprime(s, xin - 1, Globals.CopyFrom(j, pts), xin - 1, -1);
                srp[j] = new Spline_interp(s, pts[j, 0], db, de);
            }
        }

        /// <summary>
        /// Interpolate a point on the stored curve.The point is parameterized by t,
        /// in the range[0, 1]. For open curves, values of t outside this range will
        /// return extrapolations(dangerous!). For closed curves, t is periodic with
        /// period 1.
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public double[] interp(double t)
        {
            if (cls)
            {
                t = t - Math.Floor(t);
            }
            for (int j = 0; j < dim; j++)
            {
                ans[j] = (srp[j]).interp(t);
            }
            return ans;
        }

        /// <summary>
        /// Utility for estimating the derivatives at the endpoints.x and y point to
        /// the abscissa and ordinate of the endpoint.If pm is C1, points to the right
        /// will be used (left endpoint); if it is 1, points to the left will be used
        /// (right endpoint).
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="pm"></param>
        /// <returns></returns>
        public double fprime(double[] x, double[] y, int pm)
        {
            double s1 = x[0] - x[pm * 1];
            double s2 = x[0] - x[pm * 2];
            double s3 = x[0] - x[pm * 3];
            double s12 = s1 - s2;
            double s13 = s1 - s3;
            double s23 = s2 - s3;
            return -(s1 * s2 / (s13 * s23 * s3)) * y[pm * 3] + (s1 * s3 / (s12 * s2 * s23)) * y[pm * 2] - (s2 * s3 / (s1 * s12 * s13)) * y[pm * 1] + (1.0 / s1 + 1.0 / s2 + 1.0 / s3) * y[0];
        }

        private double fprime(double[] x, int off_x, double[] y, int off_y, int pm)
        {
            double s1 = x[off_x + 0] - x[off_x + pm * 1];
            double s2 = x[off_x + 0] - x[off_x + pm * 2];
            double s3 = x[off_x + 0] - x[off_x + pm * 3];
            double s12 = s1 - s2;
            double s13 = s1 - s3;
            double s23 = s2 - s3;
            return -(s1 * s2 / (s13 * s23 * s3)) * y[off_y + pm * 3] + (s1 * s3 / (s12 * s2 * s23)) * y[off_y + pm * 2] - (s2 * s3 / (s1 * s12 * s13)) * y[off_y + pm * 1] + (1.0 / s1 + 1.0 / s2 + 1.0 / s3) * y[off_y + 0];
        }
        /*
        public double rad(double[] p1, double[] p2)
        {
            double sum = 0.0;
            for (int i = 0; i < dim; i++)
            {
                sum += Globals.SQR(p1[i] - p2[i]);
            }
            if (sum <= float.Epsilon)
            {
                return 0.0;
            }
            return Math.Sqrt(sum);
        }
        */
    }
}
 

2 代码格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for interpolating a curve specified by n points in dim dimensions.
    /// </summary>
    public class Curve_interp
    {
        private int dim { get; set; }
        private int n { get; set; }
        private int xin { get; set; }
        private bool cls { get; set; }
        private double[,] pts { get; set; }
        private double[] s { get; set; }
        private double[] ans { get; set; }
        private Spline_interp[] srp { get; set; }// = new Spline_interp[];

        /// <summary>
        /// The n x dim matrix ptsin inputs the data points.Input close as 0 for an
        /// open curve, 1 for a closed curve. (For a closed curve, the last data point
        /// should not duplicate the first 鈥?the algorithm will connect them.)
        /// </summary>
        /// <param name="ptsin"></param>
        /// <param name="close"></param>
        /// <exception cref="Exception"></exception>
        public Curve_interp(double[,] ptsin, bool close = false)
        {
            this.n = ptsin.GetLength(0);
            this.dim = ptsin.GetLength(1);
            this.xin = close ? 2 * n : n;
            this.cls = close;
            this.pts = new double[dim, xin];
            this.s = new double[xin];
            this.ans = new double[dim];
            this.srp = new Spline_interp[dim];

            //int i;
            //int ii;
            //int im;
            //int j;
            //int ofs;
            //double ss;
            //double soff;
            //double db;
            //double de;
            int ofs = close ? n / 2 : 0;
            s[0] = 0.0;
            for (int i = 0; i < xin; i++)
            {
                int ii = (i - ofs + n) % n;
                int im = (ii - 1 + n) % n;
                for (int j = 0; j < dim; j++)
                {
                    pts[j, i] = ptsin[ii, j];
                }
                if (i > 0)
                {
                    //s[i] = s[i - 1] + rad(ptsin.GetRow(ii).ToArray(), ptsin.GetRow(im).ToArray());
                    s[i] = s[i - 1] + Globals.dist(Globals.CopyFrom(ii, ptsin), Globals.CopyFrom(im, ptsin));
                    if (s[i] == s[i - 1])
                    {
                        throw new Exception("error in Curve_interp");
                    }
                }
            }
            double ss = close ? s[ofs + n] - s[ofs] : s[n - 1] - s[0];
            double soff = s[ofs];
            for (int i = 0; i < xin; i++)
            {
                s[i] = (s[i] - soff) / ss;
            }
            for (int j = 0; j < dim; j++)
            {
                double db = xin < 4 ? 1.0e99 : fprime(s, 0, Globals.CopyFrom(j, pts), 0, 1);
                double de = xin < 4 ? 1.0e99 : fprime(s, xin - 1, Globals.CopyFrom(j, pts), xin - 1, -1);
                srp[j] = new Spline_interp(s, pts[j, 0], db, de);
            }
        }

        /// <summary>
        /// Interpolate a point on the stored curve.The point is parameterized by t,
        /// in the range[0, 1]. For open curves, values of t outside this range will
        /// return extrapolations(dangerous!). For closed curves, t is periodic with
        /// period 1.
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public double[] interp(double t)
        {
            if (cls)
            {
                t = t - Math.Floor(t);
            }
            for (int j = 0; j < dim; j++)
            {
                ans[j] = (srp[j]).interp(t);
            }
            return ans;
        }

        /// <summary>
        /// Utility for estimating the derivatives at the endpoints.x and y point to
        /// the abscissa and ordinate of the endpoint.If pm is C1, points to the right
        /// will be used (left endpoint); if it is 1, points to the left will be used
        /// (right endpoint).
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="pm"></param>
        /// <returns></returns>
        public double fprime(double[] x, double[] y, int pm)
        {
            double s1 = x[0] - x[pm * 1];
            double s2 = x[0] - x[pm * 2];
            double s3 = x[0] - x[pm * 3];
            double s12 = s1 - s2;
            double s13 = s1 - s3;
            double s23 = s2 - s3;
            return -(s1 * s2 / (s13 * s23 * s3)) * y[pm * 3] + (s1 * s3 / (s12 * s2 * s23)) * y[pm * 2] - (s2 * s3 / (s1 * s12 * s13)) * y[pm * 1] + (1.0 / s1 + 1.0 / s2 + 1.0 / s3) * y[0];
        }

        private double fprime(double[] x, int off_x, double[] y, int off_y, int pm)
        {
            double s1 = x[off_x + 0] - x[off_x + pm * 1];
            double s2 = x[off_x + 0] - x[off_x + pm * 2];
            double s3 = x[off_x + 0] - x[off_x + pm * 3];
            double s12 = s1 - s2;
            double s13 = s1 - s3;
            double s23 = s2 - s3;
            return -(s1 * s2 / (s13 * s23 * s3)) * y[off_y + pm * 3] + (s1 * s3 / (s12 * s2 * s23)) * y[off_y + pm * 2] - (s2 * s3 / (s1 * s12 * s13)) * y[off_y + pm * 1] + (1.0 / s1 + 1.0 / s2 + 1.0 / s3) * y[off_y + 0];
        }
        /*
        public double rad(double[] p1, double[] p2)
        {
            double sum = 0.0;
            for (int i = 0; i < dim; i++)
            {
                sum += Globals.SQR(p1[i] - p2[i]);
            }
            if (sum <= float.Epsilon)
            {
                return 0.0;
            }
            return Math.Sqrt(sum);
        }
        */
    }
}

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

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

相关文章

消息积压了如何处理?

欢迎大家到我的博客阅读这篇文章。消息积压了如何处理&#xff1f; - 胤凯 (oyto.github.io)在系统中使用消息队列的时候&#xff0c;消息积压这个问题也经常遇到&#xff0c;并且这个问题还不太好解决。 消息积压的直接原因通常是&#xff0c;系统中的某个部分出现了性能问题…

初刷leetcode题目(2)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

YOLO目标检测——无人机检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;无人机识别数据集说明&#xff1a;无人机检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

【Web】PHP反序列化的一些trick

目录 ①__wakeup绕过 ②加号绕过正则匹配 ③引用绕过相等 ④16进制绕过关键词过滤 ⑤Exception绕过 ⑥字符串逃逸 要中期考试乐(悲) ①__wakeup绕过 反序列化字符串中表示属性数量的值 大于 大括号内实际属性的数量时&#xff0c;wakeup方法会被绕过 &#xff08;php5-p…

基于海洋捕食者算法优化概率神经网络PNN的分类预测 - 附代码

基于海洋捕食者算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于海洋捕食者算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于海洋捕食者优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(八)

FULL OUTER JOIN 除了前面讲到的 INNER JOIN&#xff08;内连接&#xff09;、LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;&#xff0c;还有另外一种关联方式&#xff0c;即 FULL OUTER JOIN&#xff08;全外连接&#xff09; FULL O…

移动端路径传参以数字的形式,写死的情况

页面1 async getListTransferAndApprova() { //把mark值拼接到路径的后面&#xff0c;定义一个变量&#xff0c;使得切换穿的mark都不一样let mark ;if (this.tabsCurrent 0) {mark 2;} else if (this.tabsCurrent 1) {mark 3;}else if (this.tabsCurrent 2) {mark 4;}…

【AD封装】芯片IC-SOP,SOIC,SSOP,TSSOP,SOT(带3D)

包含了我们平时常用的芯片IC封装&#xff0c;包含SOP,SOIC,SSOP,TSSOP,SOT&#xff0c;总共171种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 ❖ TSSOP和SSOP 均为SOP衍生出来的封装。TSSOP的中文解释为&#xff1a;薄的缩小型 SOP封装。SSO…

WMS重力式货架库位对应方法

鉴于重力式货架的特殊结构和功能&#xff0c;货物由高的一端存入&#xff0c;滑至低端&#xff0c;从低端取出。所以重力式货架的每个货位在物理上都会有一个进货口和一个出货口。因此&#xff0c;在空间上&#xff0c;对同一个货位执行出入库操作需要处于不同的位置。 比如对…

Os-hackNos-1

Os-hackNos-1 一、主机发现和端口扫描 主机发现 arp-scan -l端口扫描 nmap -P 192.168.80.141二、信息收集 访问80端口&#xff0c;可知目标是ubuntu系统&#xff0c;中间件是Apache 目录扫描&#xff0c;发现两个路径 dirsearch -u http://192.168.80.141/ -e *index.html路…

FISCO BCOS 3.0【03】配置和使用pythonSDK

官方技术文档&#xff1a;https://fisco-bcos-doc.readthedocs.io/zh-cn/latest/index.html 我们在官方技术文档的基础上&#xff0c;进行&#xff0c;对文档中一些不清楚的地方进行修正 依赖软件 Ubuntu sudo apt install -y zlib1g-dev libffi6 libffi-dev wget git初始化…

STM32硬件调试器不一定准确,proteus不一定准确

我在做实验的过程中&#xff0c;发现里面的那个变量ii一直都不变搞了很久没有发现问题&#xff0c; 然后怀疑是不是软件出了问题&#xff0c;然后直接只用单片机的一个灯泡来检测是否正常&#xff0c;发现&#xff1a;单片机里面正常&#xff0c;但是硬件调试的时候&#xff0…

后端面经学习自测(三)

文章目录 1、ArrayList和Linkedlist区别&#xff1f;2、ArrayList扩容机制&#xff1f;3、ArrayList和Linkedlist分别能做什么场景&#xff1f;4、事务特性&#xff1f;MySQL事务Redis事务Spring事务5、在Spring中事务失效的场景&#xff1f;6、Java泛型&#xff1f;7、泛型擦除…

22 - 如何优化垃圾回收机制?

我们知道&#xff0c;在 Java 开发中&#xff0c;开发人员是无需过度关注对象的回收与释放的&#xff0c;JVM 的垃圾回收机制可以减轻不少工作量。但完全交由 JVM 回收对象&#xff0c;也会增加回收性能的不确定性。在一些特殊的业务场景下&#xff0c;不合适的垃圾回收算法以及…

VisualGDB 6.0 R2 Crack

轻松跨平台"VisualGDB 使 Visual Studio 的跨平台开发变得简单、舒适。它支持&#xff1a; 准系统嵌入式系统和物联网模块&#xff08;查看完整列表&#xff09; C/C Linux 应用程序 本机 Android 应用程序和库 Raspberry Pi 和其他Linux 板 Linux 内核模块&#xff08;单…

11 月 18 日 ROS 学习笔记——可视化和调试工具

文章目录 前言一、调试 ROS 节点1. gdb 调试器2. 在 ROS 节点启动时调用 gdb 调试器3. 在 ROS 节点启动时调用 valgrind 分析节点4. 设置 ROS 节点 core 文件转储5. 日志消息1). 输出日志消息2). 设置调试消息级别 二、检测系统状态1. rqt_graph2. 可视化坐标变换3. 保存与回放…

openGauss通过VIP实现的故障转移

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

浅谈WPF之控件模板和数据模板

WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计&#xff0c;同时还推出了以模板为核心的新一代设计理念。在WPF中&#xff0c;通过引入模板&#xff0c;将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类&#xff1a;数据模板【Data Template】和控…

实验(三):微程序计数器uPC实验

一、实验内容与目的 实验要求&#xff1a; 利用 CP226 实验仪上的 K16..K23 开关做为 DBUS 的数据&#xff0c;其它开关做为控制信号&#xff0c;实现微程序计数器 uPC 的写入和加1功能。 实验目的&#xff1a; 1、了解模型机中微程序的基本概念。 2、了解 uPC 的结构、工作原理…

Java 高等院校分析与推荐系统

1&#xff09;项目简介 随着我国高等教育的大众化&#xff0c;高校毕业生就业碰到了前所未有的压力&#xff0c;高校学生就业问题开始进入相关研究者们的视野。在高校学生供给忽然急剧增加的同时&#xff0c;我国高校大学生的就业机制也在发生着深刻的变化&#xff0c;作为就业…