一维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 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
随机推荐
- [转载]AxureRP学习成长之路
[编者按]本文作者@朱军华Ronzhu , 本文借用官网的描述定义,介绍了在学习AxureRP过程当中所要经历的各个阶段,也结合了作者自身学习AxureRP使用的经验,讲一下在各个阶段中的一些学习方法 ...
- NET实现微信公共平台上传下载多媒体文件(转)
举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这 ...
- Windows Azure Web Site (8) 设置Web Site时区
<Windows Azure Platform 系列文章目录> 许多已经使用Azure Web Site的用户已经发现了,Azure Web Site默认的系统时间是UTC时区. 比如我们 ...
- MVC中Action的执行过程
接着上一篇:MVC控制器的激活过程 一.代码现行,该伪代码大致解析了Action的执行的过程 try { Run each IAuthorizationFilter's OnAuthorization ...
- SQL Server数字辅助表的实现
数字辅助表是一个连续整数的数列,通常用来实现多种不同的查询任务.大多分两类:足够大物理数字表和表函数,前者可以称为静态的,后者可以称为动态且按需生产. 物理数字表 物理数字表通常存在一 ...
- 【原创】Kakfa network包源代码分析
kafka.network包主要为kafka提供网络服务,通常不包含具体的逻辑,都是一些最基本的网络服务组件.其中比较重要的是Receive.Send和Handler.Receive和Send封装了底 ...
- Ajax代码简单封装。
function ajax(url, onsuccess, onfail) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest( ...
- 字典树(Trie树)
1. trie基础 (1) 是什么? Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种. (2) 性质 根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路 ...
- 基于Ionic2的开源项目
项目介绍 基于Ionic2的Ionic中文论坛客户端,该应用也是边学边做的,为了将更多常用东西加入到APP中,有些逻辑不通之处,敬请包涵. 开源地址 https://github.com/zxj963 ...
- mysql对表操作的各种语句
创建表 create table tb_user( id int(类型)primary key(设置为主键) auto_increment (设置id自增长), 每一个字段用逗号隔开, name va ...