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

news2024/11/15 8:35:44

1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for interpolating missing data in a matrix by solving Laplace's
    /// equation.Call constructor once, then solve one or more times
    /// </summary>
    public class Laplace_interp : Linbcg
    {
        private double[,] mat { get; set; }
        private int ii { get; set; }
        private int jj { get; set; }
        private int nn { get; set; }
        private int iter;
        private double[] b;
        private double[] y;
        private double[] mask { get; set; }

        /// <summary>
        /// Values greater than 1.e99 in the input matrix mat are deemed to be missing
        /// data.The matrix is not altered until solve is called.
        /// </summary>
        /// <param name="matrix"></param>
        public Laplace_interp(double[,] matrix)
        {
            this.mat = matrix;
            this.ii = mat.GetLength(0);
            this.jj = mat.GetLength(1);
            this.nn = ii * jj;
            this.iter = 0;
            this.b = new double[nn];
            this.y = new double[nn];
            this.mask = new double[nn];

            double vl = 0.0;
            for (int k = 0; k < nn; k++)
            {
                int i = k / jj;
                int j = k - i * jj;
                if (mat[i, j] < 1.0e99)
                {
                    b[k] = y[k] = vl = mat[i, j];
                    mask[k] = 1;
                }
                else
                {
                    b[k] = 0.0;
                    y[k] = vl;
                    mask[k] = 0;
                }
            }
        }

        /// <summary>
        /// Diagonal preconditioner. (Diagonal elements all unity.)
        /// </summary>
        /// <param name="b"></param>
        /// <param name="x"></param>
        /// <param name="itrnsp"></param>
        public override void asolve(double[] b, double[] x, int itrnsp)
        {
            int n = b.Length;
            for (int i = 0; i < n; i++)
            {
                x[i] = b[i];
            }
        }

        /// <summary>
        /// Sparse matrix, and matrix transpose, multiply.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="r"></param>
        /// <param name="itrnsp"></param>
        public override void atimes(double[] x, double[] r, int itrnsp)
        {
            int n = r.Length;
            double del;
            for (int k = 0; k < n; k++)
            {
                r[k] = 0.0;
            }
            for (int k = 0; k < n; k++)
            {
                int i = k / jj;
                int j = k - i * jj;
                if (mask[k] > 0.0)
                {
                    r[k] += x[k];
                }
                else if (i > 0 && i < ii - 1 && j > 0 && j < jj - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.25 * x[k];
                        r[k - 1] += del;
                        r[k + 1] += del;
                        r[k - jj] += del;
                        r[k + jj] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.25 * (x[k - 1] + x[k + 1] + x[k + jj] + x[k - jj]);
                    }
                }
                else if (i > 0 && i < ii - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k - jj] += del;
                        r[k + jj] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + jj] + x[k - jj]);
                    }
                }
                else if (j > 0 && j < jj - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k - 1] += del;
                        r[k + 1] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + 1] + x[k - 1]);
                    }
                }
                else
                {
                    int jjt = i == 0 ? jj : -jj;
                    int it = j == 0 ? 1 : -1;
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k + jjt] += del;
                        r[k + it] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + jjt] + x[k + it]);
                    }
                }
            }
        }

        /// <summary>
        /// Invoke Linbcg::solve with appropriate arguments.The default argument
        /// values will usually work, in which case this routine need be called only
        /// once. The original matrix mat is refilled with the interpolated solution.
        /// </summary>
        /// <param name="tol"></param>
        /// <param name="itmax"></param>
        /// <returns></returns>
        public double solve(double tol = 1.0e-6, int itmax = -1)
        {
            double err = 0.0;
            if (itmax <= 0)
            {
                itmax = 2 * Math.Max(ii, jj);
            }
            solve( b,  y, 1, tol, itmax, ref iter, ref err);
            for (int k = 0, i = 0; i < ii; i++)
            {
                for (int j = 0; j < jj; j++)
                {
                    mat[i, j] = y[k++];
                }
            }
            return err;
        }
    }
}
 

2 代码格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for interpolating missing data in a matrix by solving Laplace's
    /// equation.Call constructor once, then solve one or more times
    /// </summary>
    public class Laplace_interp : Linbcg
    {
        private double[,] mat { get; set; }
        private int ii { get; set; }
        private int jj { get; set; }
        private int nn { get; set; }
        private int iter;
        private double[] b;
        private double[] y;
        private double[] mask { get; set; }

        /// <summary>
        /// Values greater than 1.e99 in the input matrix mat are deemed to be missing
        /// data.The matrix is not altered until solve is called.
        /// </summary>
        /// <param name="matrix"></param>
        public Laplace_interp(double[,] matrix)
        {
            this.mat = matrix;
            this.ii = mat.GetLength(0);
            this.jj = mat.GetLength(1);
            this.nn = ii * jj;
            this.iter = 0;
            this.b = new double[nn];
            this.y = new double[nn];
            this.mask = new double[nn];

            double vl = 0.0;
            for (int k = 0; k < nn; k++)
            {
                int i = k / jj;
                int j = k - i * jj;
                if (mat[i, j] < 1.0e99)
                {
                    b[k] = y[k] = vl = mat[i, j];
                    mask[k] = 1;
                }
                else
                {
                    b[k] = 0.0;
                    y[k] = vl;
                    mask[k] = 0;
                }
            }
        }

        /// <summary>
        /// Diagonal preconditioner. (Diagonal elements all unity.)
        /// </summary>
        /// <param name="b"></param>
        /// <param name="x"></param>
        /// <param name="itrnsp"></param>
        public override void asolve(double[] b, double[] x, int itrnsp)
        {
            int n = b.Length;
            for (int i = 0; i < n; i++)
            {
                x[i] = b[i];
            }
        }

        /// <summary>
        /// Sparse matrix, and matrix transpose, multiply.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="r"></param>
        /// <param name="itrnsp"></param>
        public override void atimes(double[] x, double[] r, int itrnsp)
        {
            int n = r.Length;
            double del;
            for (int k = 0; k < n; k++)
            {
                r[k] = 0.0;
            }
            for (int k = 0; k < n; k++)
            {
                int i = k / jj;
                int j = k - i * jj;
                if (mask[k] > 0.0)
                {
                    r[k] += x[k];
                }
                else if (i > 0 && i < ii - 1 && j > 0 && j < jj - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.25 * x[k];
                        r[k - 1] += del;
                        r[k + 1] += del;
                        r[k - jj] += del;
                        r[k + jj] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.25 * (x[k - 1] + x[k + 1] + x[k + jj] + x[k - jj]);
                    }
                }
                else if (i > 0 && i < ii - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k - jj] += del;
                        r[k + jj] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + jj] + x[k - jj]);
                    }
                }
                else if (j > 0 && j < jj - 1)
                {
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k - 1] += del;
                        r[k + 1] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + 1] + x[k - 1]);
                    }
                }
                else
                {
                    int jjt = i == 0 ? jj : -jj;
                    int it = j == 0 ? 1 : -1;
                    if (itrnsp != 0)
                    {
                        r[k] += x[k];
                        del = -0.5 * x[k];
                        r[k + jjt] += del;
                        r[k + it] += del;
                    }
                    else
                    {
                        r[k] = x[k] - 0.5 * (x[k + jjt] + x[k + it]);
                    }
                }
            }
        }

        /// <summary>
        /// Invoke Linbcg::solve with appropriate arguments.The default argument
        /// values will usually work, in which case this routine need be called only
        /// once. The original matrix mat is refilled with the interpolated solution.
        /// </summary>
        /// <param name="tol"></param>
        /// <param name="itmax"></param>
        /// <returns></returns>
        public double solve(double tol = 1.0e-6, int itmax = -1)
        {
            double err = 0.0;
            if (itmax <= 0)
            {
                itmax = 2 * Math.Max(ii, jj);
            }
            solve( b,  y, 1, tol, itmax, ref iter, ref err);
            for (int k = 0, i = 0; i < ii; i++)
            {
                for (int j = 0; j < jj; j++)
                {
                    mat[i, j] = y[k++];
                }
            }
            return err;
        }
    }
}

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

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

相关文章

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

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

Go语言常用命令详解(二)

文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…

《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

《数字图像处理-OpenCV/Python》连载&#xff08;44&#xff09;图像的投影变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变…

应用开发平台集成表单设计器系列之3——整体集成思路及表单设计器功能深度了解

背景 平台需要实现自定义表单功能&#xff0c;作为低代码开发的一部分&#xff0c;通过技术预研和技术选型&#xff0c;选择form-create和form-create-designer这两个组件进行集成作为实现方案。通过深入了解和技术验证&#xff0c;确认了组件的功能能满足需求&#xff0c;具备…

移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS

目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…

V100 GPU服务器安装GPU驱动教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

计算机网络——物理层-信道的极限容量(奈奎斯特公式、香农公式)

目录 介绍 奈氏准则 香农公式 介绍 信号在传输过程中&#xff0c;会受到各种因素的影响。 如图所示&#xff0c;这是一个数字信号。 当它通过实际的信道后&#xff0c;波形会产生失真&#xff1b;当失真不严重时&#xff0c;在输出端还可根据已失真的波形还原出发送的码元…

JVM垃圾回收相关概念

目录 一、System.gc()的理解 二、内存溢出与内存泄露 &#xff08;一&#xff09;OOM &#xff08;二&#xff09;内存泄露 三、StopTheWorld 四、垃圾回收的并行与并发 五、安全点与安全区域 &#xff08;一&#xff09;安全点 &#xff08;二&#xff09;安全区域 …

数据结构【DS】树与二叉树的应用

哈夫曼树 树的带权路径长度最小的二叉树WPL 路径长度【边数】 * 结点权值n个叶结点的哈夫曼树共有 2n-1 个结点 哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对同一组权值&#xff0c;可能存在不同构的多棵哈夫曼树&#xff0c;但树的带权路径长度最小且唯一哈夫曼树…

C/C++高精度

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;算法_仍有未知等待探索的博客-CSDN博客 为什么需要高精度算法&#xff1f; 由于c不能进行位数过高的数据运算&#xff0c;所以要通过模拟数组来进行运算&#xff0c;首先是加法。…

基于类电磁机制算法优化概率神经网络PNN的分类预测 - 附代码

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

使用ChatGPT进行数据分析案例——贷款数据分析

目录 数据数据 每一行是一个记录,代表着一笔贷款,每一列是一个特征,一共1万多条数据,最后一列非常重要save_loans是否成功收回

SpringBean的配置详解 --中

目录 Bean的初始化和销毁方法配置 Bean的初始化和销毁方法配置 扩展 Bean的实例化 Bean的初始化和销毁方法配置 当lazy-init设置为true时为延迟加载&#xff0c;也就是当Spring容器加载的时候&#xff0c;不会立即创建Bean实例&#xff0c;等待用到时再创建Bean实例并存储到单…

[AutoSar]CP autosar 面试题

目录 关键词前言面试官提问答案 关键词 嵌入式、C语言、autosar、面试题 前言 以前面试中的一些常提到的问题&#xff0c;在这里整理一下&#xff0c;希望对要去面试的道友有所帮助。 其中问题的答案后续有时间会再更新整理。 面试官提问 1.Autosar 概述&#xff1a; 解释 …

传输层协议-TCP协议

目录 TCP协议格式理解可靠性序号与确认序号16位窗口大小六个标志位连接管理机制三次握手四次挥手 确认应答机制&#xff08;ACK&#xff09;超时空重传机制流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP/UDP对比用UDP实现…

AD教程 (十九)PCB板框的评估和层叠设置

AD教程 &#xff08;十九&#xff09;PCB板框的评估和层叠设置 板子越小&#xff0c;层数越少&#xff0c;成本越低 PCB板框评估 器件摆放 CtrlA 选中全部器件点击工具&#xff0c;选择器件摆放&#xff0c;选择在矩形区域排列 框定矩形区域&#xff0c;器件就会摆放在框定的矩…

416. 分割等和子集问题(动态规划)

题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…

[AutoSar]工程中的cpuload陷阱(三)测试

目录 关键词平台说明背景一、 测试结果对比1.1 不带cache1.2 带cache 二、小结 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 背景 接着工程中的cpuload陷阱&#xff08;二)中的描述…

Android Spider App逆向 Frida - 夜神模拟器安装配置 基本使用

文章目录 前言一、Frida简单介绍&#xff1f;1.Frida是什么2.Frida原理(建议了解一下&#xff0c;否则后续的安装会有些懵懂) 二、Frida下载1.pip安装frida模块2.查看本地的frida版本&#xff0c;需要与模拟器端/手机端的版本对应&#xff0c;否则会出错3.frida下载 三、Frida安…

Figma 插件学习(一)

一.插件介绍 插件在文件中运行&#xff0c;执行一个或多个用户操作&#xff0c;并允许用户自定义其体验或创建更高效的工作流程。 插件通过专用插件API与Figma的编辑器交互。还可以利用外部Web API。 1.插件API 插件API支持读写功能&#xff0c;允许查看、创建和修改文件的…