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

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.hqwc.cn/news/196234.html

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

相关文章

计算两个向量的叉积numpy.cross()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算两个向量的叉积 numpy.cross() [太阳]选择题 请问代码中最后输出正确的是&#xff1f; import numpy as np a np.array([1, 2, 3]) b np.array([4, 5, 6]) c np.cross(a, b) pri…

iptables详解:常用模块的基本使用

目录 tcp扩展模块 multiport扩展模块 iprange扩展模块 connlimit模块 limit扩展模块 udp扩展模块 icmp扩展模块 state扩展模块 限制每分钟接收10个ICMP数据报文 允许10个数据报文快速通过&#xff0c;然后限制每分钟接收1个个ICMP数据报文 限制网络传输的带宽不可以…

【原创】WeChat Server搭建

功能 微信公众号的后端&#xff0c;为其他系统提供微信登录验证功能 源码地址 https://github.com/songquanpeng/wechat-server 创建MySQL数据库 宝塔\数据库\MySQL 添加数据库 数据库名&#xff1a;wechat_server 用户名&#xff1a;wechat_server 密码&#xff1a;fZNB…

【论文复现】QuestEval:《QuestEval: Summarization Asks for Fact-based Evaluation》

以下是复现论文《QuestEval: Summarization Asks for Fact-based Evaluation》&#xff08;NAACL 2021&#xff09;代码https://github.com/ThomasScialom/QuestEval/的流程记录&#xff1a; 在服务器上conda创建虚拟环境questeval&#xff08;python版本于readme保持一致&…

quinn源码解析:QUIC数据包是如何发送的

quinn源码解析&#xff1a;QUIC数据包是如何发送的 简介QUIC协议中的概念endpoint&#xff08;端点&#xff09;connection&#xff08;连接&#xff09;Stream&#xff08;流&#xff09;Frame (帧) 发包过程解析SendStream::write_allConnectionDriverEndpointDriver 简介 q…

拷贝对象时编译器的一些优化

在传参和传值返回的过程中&#xff0c;编译器会通过一些优化减少拷贝的次数。 class A { public:A():_a(1){cout << "A()" << endl;}A(const A& aa):_a(aa._a){cout << "A(const A& aa)" << endl;}A& operator(const …

项目自动化构建工具——make/Makefile

目录 一、概念 二、使用实例 三、原理 四、进度条程序 1、缓冲区问题 1、概念 2、\r和\n 2、代码编写 一、概念 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先…

【Java】线程池源码解析

目录 一、线程池介绍 1.1、什么是线程池 1.2、线程池的工作原理 二、Executor框架接口 2.1、JDK提供的原生线程池 2.2、类关系 三、线程池核心源码分析 3.1、关键属性 3.2、状态控制 3.3、线程池状态的跃迁 3.4、execute方法源码分析 3.5、addWorker方法源码分析 3…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

leetcode面试经典150题——28 盛最多水的容器

题目&#xff1a;盛最多水的容器 描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最…

【Django使用】django经验md文档10大模块。第4期:Django数据库增删改查

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…