C#,数值计算——偏微分方程,Mglin的计算方法与源程序
1 文本格式
using System;
using System.Collections.Generic;
namespace Legalsoft.Truffer
{
public class Mglin
{
private int n { get; set; }
private int ng { get; set; }
private double[,] uj1 { get; set; }
private List<double[,]> rho { get; set; } = new List<double[,]>();
public Mglin(double[,] u, int ncycle)
{
this.n = u.GetLength(0);
this.ng = 0;
int nn = n;
while ((nn >>= 1) != 0)
{
ng++;
}
if ((n - 1) != (1 << ng))
{
throw new Exception("n-1 must be a power of 2 in mglin.");
}
nn = n;
int ngrid = ng - 1;
//rho.resize(ng);
rho = new List<double[,]>(ng);
rho[ngrid] = new double[nn, nn];
rho[ngrid] = u;
while (nn > 3)
{
nn = nn / 2 + 1;
rho[--ngrid] = new double[nn, nn];
//rstrct(ref rho[ngrid], rho[ngrid + 1]);
double[,] tmp = rho[ngrid];
rstrct(tmp, rho[ngrid + 1]);
//rho[ngrid] = new double[,](tmp);
rho[ngrid] = Globals.CopyFrom(tmp);
}
nn = 3;
double[,] uj = new double[nn, nn];
slvsml(uj, rho[0]);
for (int j = 1; j < ng; j++)
{
nn = 2 * nn - 1;
uj1 = uj;
uj = new double[nn, nn];
interp(uj, uj1);
uj1 = null;
for (int jcycle = 0; jcycle < ncycle; jcycle++)
{
mg(j, uj, rho[j]);
}
}
u = uj;
}
public void interp(double[,] uf, double[,] uc)
{
int nf = uf.GetLength(0);
int nc = nf / 2 + 1;
for (int jc = 0; jc < nc; jc++)
{
for (int ic = 0; ic < nc; ic++)
{
uf[2 * ic, 2 * jc] = uc[ic, jc];
}
}
for (int jf = 0; jf < nf; jf += 2)
{
for (int iif = 1; iif < nf - 1; iif += 2)
{
uf[iif, jf] = 0.5 * (uf[iif + 1, jf] + uf[iif - 1, jf]);
}
}
for (int jf = 1; jf < nf - 1; jf += 2)
{
for (int iif = 0; iif < nf; iif++)
{
uf[iif, jf] = 0.5 * (uf[iif, jf + 1] + uf[iif, jf - 1]);
}
}
}
public void addint(double[,] uf, double[,] uc, double[,] res)
{
int nf = uf.GetLength(0);
interp(res, uc);
for (int j = 0; j < nf; j++)
{
for (int i = 0; i < nf; i++)
{
uf[i, j] += res[i, j];
}
}
}
public void slvsml(double[,] u, double[,] rhs)
{
double h = 0.5;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
u[i, j] = 0.0;
}
}
u[1, 1] = -h * h * rhs[1, 1] / 4.0;
}
public void relax(double[,] u, double[,] rhs)
{
int n = u.GetLength(0);
double h = 1.0 / (n - 1);
double h2 = h * h;
for (int ipass = 0, jsw = 1; ipass < 2; ipass++, jsw = 3 - jsw)
{
for (int j = 1, isw = jsw; j < n - 1; j++, isw = 3 - isw)
{
for (int i = isw; i < n - 1; i += 2)
{
u[i, j] = 0.25 * (u[i + 1, j] + u[i - 1, j] + u[i, j + 1] + u[i, j - 1] - h2 * rhs[i, j]);
}
}
}
}
public void resid(double[,] res, double[,] u, double[,] rhs)
{
int n = u.GetLength(0);
double h = 1.0 / (n - 1);
double h2i = 1.0 / (h * h);
for (int j = 1; j < n - 1; j++)
{
for (int i = 1; i < n - 1; i++)
{
res[i, j] = -h2i * (u[i + 1, j] + u[i - 1, j] + u[i, j + 1] + u[i, j - 1] - 4.0 * u[i, j]) + rhs[i, j];
}
}
for (int i = 0; i < n; i++)
{
res[i, 0] = res[i, n - 1] = res[0, i] = res[n - 1, i] = 0.0;
}
}
public void rstrct(double[,] uc, double[,] uf)
{
int nc = uc.GetLength(0);
int ncc = 2 * nc - 2;
for (int jf = 2, jc = 1; jc < nc - 1; jc++, jf += 2)
{
for (int iif = 2, ic = 1; ic < nc - 1; ic++, iif += 2)
{
uc[ic, jc] = 0.5 * uf[iif, jf] + 0.125 * (uf[iif + 1, jf] + uf[iif - 1, jf] + uf[iif, jf + 1] + uf[iif, jf - 1]);
}
}
for (int jc = 0, ic = 0; ic < nc; ic++, jc += 2)
{
uc[ic, 0] = uf[jc, 0];
uc[ic, nc - 1] = uf[jc, ncc];
}
for (int jc = 0, ic = 0; ic < nc; ic++, jc += 2)
{
uc[0, ic] = uf[0, jc];
uc[nc - 1, ic] = uf[ncc, jc];
}
}
public void mg(int j, double[,] u, double[,] rhs)
{
const int NPRE = 1;
const int NPOST = 1;
int nf = u.GetLength(0);
int nc = (nf + 1) / 2;
if (j == 0)
{
slvsml(u, rhs);
}
else
{
double[,] res = new double[nc, nc];
double[,] v = new double[nc, nc];
double[,] temp = new double[nf, nf];
for (int jpre = 0; jpre < NPRE; jpre++)
{
relax(u, rhs);
}
resid(temp, u, rhs);
rstrct(res, temp);
mg(j - 1, v, res);
addint(u, v, temp);
for (int jpost = 0; jpost < NPOST; jpost++)
{
relax(u, rhs);
}
}
}
}
}
2 代码格式
using System;
using System.Collections.Generic;namespace Legalsoft.Truffer
{public class Mglin{private int n { get; set; }private int ng { get; set; }private double[,] uj1 { get; set; }private List<double[,]> rho { get; set; } = new List<double[,]>();public Mglin(double[,] u, int ncycle){this.n = u.GetLength(0);this.ng = 0;int nn = n;while ((nn >>= 1) != 0){ng++;}if ((n - 1) != (1 << ng)){throw new Exception("n-1 must be a power of 2 in mglin.");}nn = n;int ngrid = ng - 1;//rho.resize(ng);rho = new List<double[,]>(ng);rho[ngrid] = new double[nn, nn];rho[ngrid] = u;while (nn > 3){nn = nn / 2 + 1;rho[--ngrid] = new double[nn, nn];//rstrct(ref rho[ngrid], rho[ngrid + 1]);double[,] tmp = rho[ngrid];rstrct(tmp, rho[ngrid + 1]);//rho[ngrid] = new double[,](tmp);rho[ngrid] = Globals.CopyFrom(tmp);}nn = 3;double[,] uj = new double[nn, nn];slvsml(uj, rho[0]);for (int j = 1; j < ng; j++){nn = 2 * nn - 1;uj1 = uj;uj = new double[nn, nn];interp(uj, uj1);uj1 = null;for (int jcycle = 0; jcycle < ncycle; jcycle++){mg(j, uj, rho[j]);}}u = uj;}public void interp(double[,] uf, double[,] uc){int nf = uf.GetLength(0);int nc = nf / 2 + 1;for (int jc = 0; jc < nc; jc++){for (int ic = 0; ic < nc; ic++){uf[2 * ic, 2 * jc] = uc[ic, jc];}}for (int jf = 0; jf < nf; jf += 2){for (int iif = 1; iif < nf - 1; iif += 2){uf[iif, jf] = 0.5 * (uf[iif + 1, jf] + uf[iif - 1, jf]);}}for (int jf = 1; jf < nf - 1; jf += 2){for (int iif = 0; iif < nf; iif++){uf[iif, jf] = 0.5 * (uf[iif, jf + 1] + uf[iif, jf - 1]);}}}public void addint(double[,] uf, double[,] uc, double[,] res){int nf = uf.GetLength(0);interp(res, uc);for (int j = 0; j < nf; j++){for (int i = 0; i < nf; i++){uf[i, j] += res[i, j];}}}public void slvsml(double[,] u, double[,] rhs){double h = 0.5;for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){u[i, j] = 0.0;}}u[1, 1] = -h * h * rhs[1, 1] / 4.0;}public void relax(double[,] u, double[,] rhs){int n = u.GetLength(0);double h = 1.0 / (n - 1);double h2 = h * h;for (int ipass = 0, jsw = 1; ipass < 2; ipass++, jsw = 3 - jsw){for (int j = 1, isw = jsw; j < n - 1; j++, isw = 3 - isw){for (int i = isw; i < n - 1; i += 2){u[i, j] = 0.25 * (u[i + 1, j] + u[i - 1, j] + u[i, j + 1] + u[i, j - 1] - h2 * rhs[i, j]);}}}}public void resid(double[,] res, double[,] u, double[,] rhs){int n = u.GetLength(0);double h = 1.0 / (n - 1);double h2i = 1.0 / (h * h);for (int j = 1; j < n - 1; j++){for (int i = 1; i < n - 1; i++){res[i, j] = -h2i * (u[i + 1, j] + u[i - 1, j] + u[i, j + 1] + u[i, j - 1] - 4.0 * u[i, j]) + rhs[i, j];}}for (int i = 0; i < n; i++){res[i, 0] = res[i, n - 1] = res[0, i] = res[n - 1, i] = 0.0;}}public void rstrct(double[,] uc, double[,] uf){int nc = uc.GetLength(0);int ncc = 2 * nc - 2;for (int jf = 2, jc = 1; jc < nc - 1; jc++, jf += 2){for (int iif = 2, ic = 1; ic < nc - 1; ic++, iif += 2){uc[ic, jc] = 0.5 * uf[iif, jf] + 0.125 * (uf[iif + 1, jf] + uf[iif - 1, jf] + uf[iif, jf + 1] + uf[iif, jf - 1]);}}for (int jc = 0, ic = 0; ic < nc; ic++, jc += 2){uc[ic, 0] = uf[jc, 0];uc[ic, nc - 1] = uf[jc, ncc];}for (int jc = 0, ic = 0; ic < nc; ic++, jc += 2){uc[0, ic] = uf[0, jc];uc[nc - 1, ic] = uf[ncc, jc];}}public void mg(int j, double[,] u, double[,] rhs){const int NPRE = 1;const int NPOST = 1;int nf = u.GetLength(0);int nc = (nf + 1) / 2;if (j == 0){slvsml(u, rhs);}else{double[,] res = new double[nc, nc];double[,] v = new double[nc, nc];double[,] temp = new double[nf, nf];for (int jpre = 0; jpre < NPRE; jpre++){relax(u, rhs);}resid(temp, u, rhs);rstrct(res, temp);mg(j - 1, v, res);addint(u, v, temp);for (int jpost = 0; jpost < NPOST; jpost++){relax(u, rhs);}}}}
}
相关文章:

C#,数值计算——偏微分方程,Mglin的计算方法与源程序
1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Mglin { private int n { get; set; } private int ng { get; set; } private double[,] uj1 { get; set; } private Lis…...

一机服务万人,拓世法宝AI智能商业数字人一体机,解锁文旅新表达
在人工智能的强劲推动下,人们走进了一个令人振奋的数字化时代。如何让文化传承与现代科技完美融合,成为一个十分有趣的议题,当AI技术结合文旅生活,便悄然开启了一种全新的旅游服务模式——AI数字文旅。 在我国国家博物馆、文旅大…...

【源码解析】聊聊SpringBean是如何初始化和创建
我们知道通过类进行修复不同的属性,比如单例、原型等,而具体的流程是怎么样的呢,这一篇我们开始从源码的视角分析以下。 刷新方法 在刷新容器中有一个方法,其实就是 Bean创建的过程。 finishBeanFactoryInitialization(beanFact…...

【0基础学Java第六课】-- 数组的定义与使用
6 数组的定义与使用 6.1 什么是数组6.2 数组的创建及初始化6.2.1 数组的创建:6.2.2 数组的初始化 6.3 数组的使用6.3.1 数组中元素的访问6.3.2 Java中JVM当中的内存划分6.3.3 遍历数组 6.4 数组是引用类型6.4.1 初始JVM的内存分布6.4.2 基本类型变量与引用类型变量的…...
后台项目Gradle打包jar,不包含依赖jar并放到外部路径
# 1.Gradle打包jar # 2.依赖jar包外放到其他目录 # 3.保留引用关系 # 4.去掉引入的缓存build.gradle// 需要放到dependencies下面 // 傻逼问题 1 这个jar打包还得主动开 jar.enabled true // 1.清除上一次的lib目录 task clearJar(type: Delete) {delete "$buildDir\\lib…...

NSSCTF web刷题记录4
文章目录 [NSSRound#4 SWPU]1zweb(revenge)[强网杯 2019]高明的黑客[BJDCTF 2020]Cookie is so subtle![MoeCTF 2021]fake game[第五空间 2021]PNG图片转换器[ASIS 2019]Unicorn shop[justCTF 2020]gofs[UUCTF 2022 新生赛]phonecode[b01lers 2020]Life On Mars[HZNUCTF 2023 f…...

什么是大模型?一文读懂大模型的基本概念
大模型是指具有大规模参数和复杂计算结构的机器学习模型。本文从大模型的基本概念出发,对大模型领域容易混淆的相关概念进行区分,并就大模型的发展历程、特点和分类、泛化与微调进行了详细解读,供大家在了解大模型基本知识的过程中起到一定参…...

数据结构之队的实现
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...

【实战Flask API项目指南】之三 路由和视图函数
实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 当小菜踏入Flask后端开发的世界时&…...
mediasoup udp端口分配策略
mediasoup-worker多进程启动时,rtcMinPort/rtcMaxPort可以使用相同的配置。 for (let i 0; i < numWorkers; i) { let worker await mediasoup.createWorker({ logLevel: config.mediasoup.worker.logLevel, logTags: config.mediasoup.work…...

山西电力市场日前价格预测【2023-11-07】
日前价格预测 预测说明: 如上图所示,预测明日(2023-11-07)山西电力市场全天平均日前电价为318.54元/MWh。其中,最高日前电价为514.01元/MWh,预计出现在18: 00。最低日前电价为192.95元/MWh,预计…...

Microsoft Dynamics 365 CE 扩展定制 - 5. 外部集成
本章内容包括: 使用.NET从其他系统连接到Dynamics 365使用OData(Java)从其他系统连接到Dynamics 365使用外部库从外部源检索数据使用web应用程序连接到Dynamics 365运行Azure计划任务设置Azure Service Bus终结点与Azure Service Bus构建近乎实时的集成使用来自Azure服务总线…...

手机升级STM32单片机,pad下载程序,手机固件升级单片机,局域网程序下载,STM32单片机远程下载升级
STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统BootLoader的编写…...

【漏洞复现】weblogic-SSRF漏洞
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 漏洞测试注入HTTP头,利用Redis反弹shell 问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞࿰…...
FreeSWTCH dialplan check nosdp
应朋友要求写一段dialplan,如果没有sdp(sip_profile打开了3pcc),马上回486,当然如果有sdp,dialplan正常往下走 我试了试,貌似不太复杂,如下: <!-- check no sdp --&…...

微信小程序案例3-1 比较数字
文章目录 一、运行效果二、知识储备(一)Page()函数(二)数据绑定(三)事件绑定(四)事件对象(五)this关键字(六)setData()方法࿰…...

哈希表----数据结构
引入 如果你是一个队伍的队长,现在有 24 个队员,需要将他们分成 6 组,你会怎么分?其实有一种方法是让所有人排成一排,然后从队头开始报数,报的数字就是编号。当所有人都报完数后,这 24 人也被分…...
可达矩阵-邻接矩阵-以及有向图的python绘制
参考1 自定义输入矩阵来绘制 根据参考代码, 自定义 代码如下: # 编程实现有向图连通性的判断 from pylab import mplmpl.rcParams[font.sans-serif] [SimHei] mpl.rcParams[axes.unicode_minus] False import numpy as np import networkx as nx imp…...
react typescript @别名的使用
1、config/webpack.config.js中找到alias,添加: path.resolve(src) ,如下: alias: {// Support React Native Web// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/"react-native&qu…...

C++性能优化笔记-6-C++元素的效率差异-7-类型转换
C元素的效率差异 类型转换signed与unsigned转换整数大小转换浮点精度转换整数到浮点转换浮点到整数转换指针类型转换重新解释对象的类型const_caststatic_castreinterpret_castdynamic_cast转换类对象 类型转换 在C语法中,有几种方式进行类型转换: // …...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...