一维Poisson方程计算


package com.smartmap.algorithm.equation.differential.partial.ellipsoidal; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter; public class PoissonIteration {
public static void main(String[] args) {
int m = 64; int n = 32;
double minX = 0;
double maxX = 2;
double dx = (maxX - minX) / m;
double minY = 0;
double maxY = 1;
double dy = (maxY - minY) / n;
//
double xx[][] = new double[m+1][n+1];
//
System.out.println("----------------------------------------");
for(int j=0; j<m+1; j++)
{
double value = dx * j;
System.out.print(value + " ");
}
System.out.println("");
System.out.println("----------------------------------------");
for(int j=0; j<n+1; j++)
{
double value = dy * j;
System.out.print(value + " ");
}
System.out.println("");
//
for(int j=0; j<n+1; j++)
{
double value = dy * j;
xx[0][j] = getZeroXU(value);
xx[m][j] = getTwoXU(value);
}
for(int k=0; k<m+1; k++)
{
double value = dx * k;
xx[k][0] = getZeroYU(value);
xx[k][n] = getOneYU(value);
}
double error;
while(true)
{
error = gaussSeidelCompute(xx, m, n, dx, dy);
System.out.println("error: "+error);
if(error < 0.00000000001)
{
break;
}
}
System.out.println("--------------------------------");
for(int k=0; k<n+1; k++)
{
for(int j=0; j<m+1; j++)
{
System.out.printf(" %8.6f", xx[j][k]);
}
System.out.println(";");
}
} public static double gaussSeidelCompute(double[][] xx, int m, int n, double dx, double dy)
{
double dxdy = (1.0/Math.pow(dy, 2) + 1.0/Math.pow(dx, 2)) * 2;
double error = 0;
for(int i=1; i<m; i++)
{
for(int j=1; j<n; j++)
{
double oldValue = xx[i][j];
double x = 0 + dx * i;
double y = 0 + dy * j;
double f = getF(x, y);
xx[i][j] = (f + xx[i][j-1]*(1.0/Math.pow(dy, 2)) + xx[i-1][j]*(1.0/Math.pow(dx, 2)) + xx[i+1][j]*(1.0/Math.pow(dx, 2)) + xx[i][j+1]*(1.0/Math.pow(dy, 2)));
xx[i][j] = xx[i][j] / dxdy;
oldValue = Math.abs(xx[i][j] - oldValue);
if(oldValue > error)
error = oldValue;
}
}
return error;
}
public static void outputAA(double[][] aa, int elementCount, String filePath, String fileName)
{
try
{
FileOutputStream fileStream = new FileOutputStream(filePath + "\\"+fileName+".txt", false);
OutputStream outputStream = fileStream;
StringWriter streamWriter=new StringWriter();
for(int j=0; j<elementCount; j++)
{
for(int k=0; k<elementCount; k++)
{
streamWriter.write(String.format(" %8.6f", aa[j][k]));
}
streamWriter.write("\n");
}
char[] linearRingStringCharArray = streamWriter.toString().toCharArray();
for(int i=0; i<linearRingStringCharArray.length; i++)
{
outputStream.write(linearRingStringCharArray[i]);
}
fileStream.close();
streamWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static double getF(double x, double y)
{
double returnValue = 0;
returnValue = (Math.pow(Math.PI, 2) - 1) * Math.exp(x) * Math.sin(Math.PI * y);
return returnValue;
}
public static double getZeroXU(double y)
{
double returnValue = 0;
returnValue = Math.sin(Math.PI * y);
return returnValue;
}
public static double getTwoXU(double y)
{
double returnValue = 0;
returnValue = Math.exp(2) * Math.sin(Math.PI * y);
return returnValue;
}
public static double getZeroYU(double y)
{
double returnValue = 0;
return returnValue;
}
public static double getOneYU(double y)
{
double returnValue = 0;
return returnValue;
}
}
一维Poisson方程计算的更多相关文章
- 三维网格补洞算法(Poisson Method)
下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...
- python科学计算_numpy_线性代数/掩码数组/内存映射数组
1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...
- 三维网格补洞算法(Poisson Method)(转载)
转载:https://www.cnblogs.com/shushen/p/5864042.html 下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网 ...
- FESTUNG模型介绍—1.对流方程求解
FESTUNG模型介绍-1.对流方程求解 1. 控制方程 对流问题中,控制方程表达式为 \[\partial_t C + \partial_x (u^1 C) + \partial_y (u^2 C) ...
- 有限差分法(Finite Difference Method)解方程:边界和内部结点的控制方程
FDM解常微分方程 问题描述 \[\frac{d^2\phi}{dx^2}=S_{\phi} \tag{1} \] 这是二阶常微分方程(second-order Ordinary Differenti ...
- [zz]计算 协方差矩阵
http://www.cnblogs.com/chaosimple/p/3182157.html http://blog.csdn.net/goodshot/article/details/86111 ...
- Python数据处理与计算——概述
Python是一种面向对象的,动态的程序设计语言,具有非常简洁而清晰的语法,适合于完成各种高层任务.它既可以用来快速开发程序脚本,也可以用来开发大规模的软件. 随着NumPy.SciPy.Matplo ...
- Unity3D中的弹道和移动目标提前量计算
弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法. 讨论的前提是,假设目标 ...
- 游戏的物理和数学:Unity中的弹道和移动目标提前量计算
下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
随机推荐
- 24个 HTML5 & CSS3 下拉菜单效果及制作教程
下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...
- 12个学习 CSS3 网站布局设计的优秀案例
网络上有很多的 CSS 画廊站点供大家对各类网站作品进行打分和评论,每天有数以百计的优秀网站被推荐上面,这对于网页设计师来说是很好的灵感来源.今天,我们选择了15赢得 CSS 设计大奖的优秀作品,帮助 ...
- Java魔法堂:解读基于Type Erasure的泛型
一.前言 还记得JDK1.4时遍历列表的辛酸吗?我可是记忆犹新啊,那时因项目需求我从C#转身到Java的怀抱,然后因JDK1.4少了泛型这样语法糖(还有自动装箱.拆箱),让我受尽苦头啊,不过也反映自己 ...
- C++二维码相关库编译
一.瞎想 坐在地铁上闲来无聊,突然想到了二维码,顺手就百度了下相关的资料,目前C++二维码相关的库不多,也就zbar(开源中国上下了半天也没下载下来).zxing,不过这两个库据说都是解析二维码的,不 ...
- Navigation Drawer的使用及遇到的问题
ActionBar的问题 Navigation View是Android Support Library中的一个新的组件,该组件提供类似于Sliding Menu的抽屉功能,在张兴业的博客中有讲解到具 ...
- Spring MVC 对于@ModelAttribute 、@SessionAttributes 的详细处理流程
初学 Spring MVC , 感觉对于 @ModelAttribute 和 @SessionAttributes 是如何被Spring MVC处理的,这一流程不是很清楚, 经过Google资料,有了 ...
- RAID一个硬盘FAIL。
周六本想清静学习一下,刚把咖啡冲好还没有来得及坐下,机房却传来让人心揪的报警声,原来一台服务器一个硬盘FAIL(挂了...... 抽换好的一个容量大小的SCSI硬盘,再次进入这个介面,选择Force ...
- Socket开发框架之数据加密及完整性检查
在前面两篇介绍了Socket框架的设计思路以及数据传输方面的内容,整个框架的设计指导原则就是易于使用及安全性较好,可以用来从客户端到服务端的数据安全传输,那么实现这个目标就需要设计好消息的传输和数据加 ...
- ASP.NET Core 开发 - Entity Framework (EF) Core
EF Core 1.0 Database First http://www.cnblogs.com/linezero/p/EFCoreDBFirst.html ASP.NET Core 开发 - En ...
- Android存储空间不足的解决办法
安装应用时,有时会出现错误Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE,这是存储空间不足的错误,这时就只能将应用安装到SD卡,在And ...