追赶法java代码 追赶法流程图

急crank-nicolson代码追赶法代码怎么打啊对于扩散方程(包括许多其他方程) , 可以证明Crank-Nicolson方法无条件稳定 。但是,如果时间步长与空间步长平方的比值过大(一般地,大于1/2),近似解中将存在虚假的振荡或衰减 。基于这个原因,当要求大时间步或高空间分辨率的时候,往往会采用数值精确较差的后向欧拉方法进行计算,这样即可以保证稳定,又避免了解的伪振荡 。
\frac{u_{i}^{n1} - u_{i}^{n}}{\Delta t} =F_{i}^{n}\left(u, x, t, \frac{\partial u}{\partial x}, \frac{\partial^2 u}{\partial x^2}\right) (前向欧拉方法) \frac{u_{i}^{n1} - u_{i}^{n}}{\Delta t} =F_{i}^{n1}\left(u, x, t, \frac{\partial u}{\partial x}, \frac{\partial^2 u}{\partial x^2}\right) (后向欧拉方法) \frac{u_{i}^{n1} - u_{i}^{n}}{\Delta t} =\frac{1}{2}\left( F_{i}^{n1}\left(u, x, t, \frac{\partial u}{\partial x}, \frac{\partial^2 u}{\partial x^2}\right)F_{i}^{n}\left(u, x, t, \frac{\partial u}{\partial x}, \frac{\partial^2 u}{\partial x^2}\right) \right) (Crank-Nicolson) 线性扩散问题
线性扩散方程 \frac{\partial u}{\partial t} = a \frac{\partial^2 u}{\partial x^2} 通过Crank-Nicolson方法将得到离散方程
\frac{u_{i}^{n1} - u_{i}^{n}}{\Delta t} = \frac{a}{2 (\Delta x)^2}\left( (u_{i1}^{n1} - 2 u_{i}^{n1}u_{i - 1}^{n1})(u_{i1}^{n} - 2 u_{i}^{n}u_{i - 1}^{n}) \right) 引入变量r = \frac{a \Delta t}{2 (\Delta x)^2}:
-r u_{i1}^{n1}(12 r)u_{i}^{n1} - r u_{i - 1}^{n1} = r u_{i1}^{n}(1 - 2 r)u_{i}^{n}r u_{i - 1}^{n}\, 这是一个三对角问题,应用三对角矩阵算法(追赶法)即可得到u_{i}^{n 1},而不需要对矩阵直接求逆 。
准线性扩散方程 \frac{\partial u}{\partial t} = a(u) \frac{\partial^2 u}{\partial x^2} 离散化后则会得到非线性方程系统 。但是某些情况下 , 通过使用a的旧值 , 即用a_{i}^{n}(u)\, 替代a_{i}^{n1}(u)\,,可将问题线性化 。其他时候,也可能在保证稳定性的基础上使用显式方法估计a_{i}^{n1}(u)\,
用java语言编写追赶法求解n阶三对角方程组可以这样写,代码如下
#include "pch.h"
#include iomanip
#include iostream
# include fstream
#include iomanip
#include math.h
void Chasing_method(double **a, double *b, double *xx, int N_num);
using namespace std;
//*****************************
//追赶法求解AX=B矩阵
//*****************************
void Chasing_method(double **a, double *b, double *xx, int N_num)
{
int i, j, k;
double *gamma = new double[N_num]();
double *alpha = new double[N_num]();
double *beta = new double[N_num]();
double *y = new double[N_num]();
alpha[0] = a[0][0];
beta[0] = a[1][0] / alpha[0]; y[0] = b[0] / alpha[0];
for (i = 1; iN_num; i)
{
gamma[i] = a[i - 1][i];
alpha[i] = a[i][i] - gamma[i] * beta[i - 1];
if (iN_num - 1)
{
beta[i] = a[i1][i] / alpha[i];
}
y[i] = (b[i] - gamma[i] * y[i - 1]) / alpha[i];
}
xx[N_num - 1] = y[N_num - 1];
for (i = N_num - 2; i = 0; i--)
{
xx[i] = y[i] - beta[i] * xx[i1];
}
}
int main()
{
int N_num = 4;
【追赶法java代码 追赶法流程图】 double **a = new double*[N_num]();
for (int i = 0; iN_num; i)//AX=B方程a[n][n]为系数矩阵
a[i] = new double[N_num]();
double *b = new double[N_num]();//AX=B方程b[n]为右侧列矩阵
double *x = new double[N_num]();//AX=B方程x[n]为方程解
ifstream fin("ab.txt");
for (int i=0; iN_num; i)
{
for (int j=0; jN_num; j)
{
fina[i][j];//读取数
coutfixedsetw(8)setprecision(4)a[i][j];
}
finb[i];
coutfixedsetw(8)setprecision(4)b[i]endl;
}
Chasing_method(a, b, x, N_num);
cout"追赶法求得方程组解为:"endl;
for (int i = 0; iN_num; i)
{
cout"x["i"]="fixedsetw(8)setprecision(4)x[i]endl;
}
}
python如何给追赶法编写程序追赶法是解决稀疏矩阵追赶法java代码的 一种方法 , 但应该满足对角占优,否则不能进行计算,下面是程序,语言为java
[java] view plain copy
import java.util.Scanner;
/**
* Created by q on 2017/11/30.
*/
public class ChasingMethod {
private int num; //numb比矩阵追赶法java代码的阶大一,不用下标是0的空间
private double a[];
private double b[];
private double c[];
private double y[];
public ChasingMethod(int num, double[] a, double[] b, double[] c, double[] y) {
this.num = num;
this.a = a;
this.b = b;
this.c = c;
this.y = y;
}
public boolean check(){//判断是否对角占优
if(Math.abs(b[1])Math.abs(c[1])) returnfalse;
for(int i = 2;i num ;i){
double temp = Math.abs(a[i])Math.abs(c[i]);
if(Math.abs(b[i])temp){
return false;
}
}
if(Math.abs(b[num])Math.abs(a[num])) returnfalse;
return true;
}
public void calB(){
c[1] =c[1]*1.0/b[1];
for(int i = 2;i num ;i){
c[i] = c[i] *1.0/ (b[i] - a[i]* c[i-1]); //Ci = Ci/( bi-aiβi-1)
}
}
public void calY(){
y[1] = y[1]*1.0 / b[1];
for(int i = 2;i = num ;i){
y[i] = (y[i] - a[i]*y[i-1])*1.0/ (b[i] - a[i]* c[i-1]);
//fi = (fi -aiyi-1)/ ( bi-aiβi-1)(yi-1已存放在fi-1,βi-1已存入Ci-1)
}
}
public void calX(){
for(int i = num-1;i0;i--){
y[i] = y[i] - c[i]* y[i 1];//fi = fi -Ci fi 1
}
}
public void print(){
for(int i = 1;i=num;i){
System.out.println(y[i]);
}
}
public static void main(String [] args){
Scanner scanner = new Scanner(System.in);
int n;
System.out.println("请输入X的个数");
n = scanner.nextInt();
double a[] = new double[n 1];
double b[] = new double[n 1];
double c[] = new double[n 1];
double y[] = new double[n 1];
System.out.println("请输入A数组");
for(int i=2;i=n;i){
a[i] = scanner.nextDouble();
}
System.out.println("请输入B数组");
for(int i=1;i=n;i){
b[i] = scanner.nextDouble();
}
System.out.println("请输入C数组");
for(int i=1;i=n-1;i){
c[i] = scanner.nextDouble();
}System.out.println("请输入Y数组");
for(int i=1;i=n;i){
y[i] = scanner.nextDouble();
}
ChasingMethod method = newChasingMethod(n,a,b,c,y);
if(!method.check()){
System.out.println("不满足对焦占优的条件,程序退出");
return;
}
method.calB();
method.calY();
method.calX();
method.print();
}
}
追赶法java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于追赶法流程图、追赶法java代码的信息别忘了在本站进行查找喔 。

    推荐阅读