微分方程差分三对角矩阵解法C语言程序

合集下载

微分方程数值解追赶法

微分方程数值解追赶法

微分方程数值解追赶法追赶法,也称为三对角矩阵算法,是一种用于求解线性微分方程的数值方法。

这种方法主要基于矩阵分解和迭代的思想,能够有效地解决微分方程的数值求解问题。

在微分方程的数值解法中,追赶法通常用于求解形如 (y' = f(x, y)) 的常微分方程。

其基本思想是将微分方程转化为差分方程,然后通过迭代的方式逐步逼近微分方程的解。

具体来说,追赶法的步骤如下:矩阵分解:首先,将微分方程 (y' = f(x, y)) 转化为差分方程的形式。

然后,将差分方程中的系数矩阵进行分解,将其分解为一个下三角矩阵 (L)、一个对角矩阵 (D) 和一个上三角矩阵 (U)。

这样,差分方程可以转化为(D^{-1}Lx = D^{-1}b) 的形式。

迭代求解:接下来,使用迭代法求解 (D^{-1}Lx = D^{-1}b)。

通常,可以选择Gauss-Seidel迭代法或者SOR(Successive Over-Relaxation)迭代法等。

在每次迭代中,先求解下三角矩阵 (L) 的部分,然后求解对角矩阵(D) 的部分,最后求解上三角矩阵 (U) 的部分。

通过不断迭代,逐步逼近差分方程的解。

收敛性判断:在迭代求解的过程中,需要判断迭代的解是否收敛。

通常,可以通过比较相邻两次迭代的解的差值来判断是否收敛。

当差值小于某个预设的阈值时,认为迭代收敛。

解的输出:当迭代收敛后,可以得到微分方程的数值解。

此时,可以将解输出到控制台或者保存到文件中。

追赶法的优点在于其算法简单、易于实现,并且对于大规模的微分方程求解问题具有较高的计算效率和精度。

然而,追赶法也存在一些局限性,例如对于某些特殊类型的微分方程可能不适用,需要进行特殊处理。

三对角方程组的并行解法

三对角方程组的并行解法

本算法中设有 p 台并行机,把 A 分裂为 p p 块三对角形式,其中每一主对角块是 k k 的三对角阵,即 n pk 因此每一台处理机主要处理一个k 阶的三对角块,其分解形式为:
A0 BT 0 A
其中:
B0 A1
B1 BT p 3
Ap 2 BT p2

p 1 m 2 p 1 m 1

0 0 00 0 0 0 1 10 A

0 1


0 m 2 0 m 2 0 m b0 1
b m2
p2
0
b m 1
p2
0
b0 b1 bm2 b m 1
0 0 0
0
b0 b1
p 2 p 2

b0
b1

b m2
d 0p 1 d1p 1
p 1 dm 2
b
p 2 m 1 p 2
b m 1
p2 b m 1 p 1 d m 1
三对角方程组的并行算法设所要求解的对称正定三对角线方程组成为ax称正定三对角矩阵且非奇异具体形式为n2n2xn2yn2n2n1xn1yn1本算法中设有台并行机把分裂为块三对角形式其中每一主对角块是的三对角阵即npk因此每一台处理机主要处理一个k阶的三对角块其分解形式a0b0m2m2bim2m1m2m2m2m1m1p2b0b1bm2bm1则此时l1alt有如下形式
T T T T
x1 xmp 1 ] 中的 x j 均可直接得到,
,
yj dj
(三) 数值结果分析

编写用追赶法解三对角线性方程组的程序,并解下列方程组

编写用追赶法解三对角线性方程组的程序,并解下列方程组

计算方法与实习上机实验(二)实验名称:编写用追赶法解三对角线性方程组的程序,并解下列方程组:(1)⎪⎪⎩⎪⎪⎨⎧-=+-=-+--=-+-=-12,112,122,524343232121x x x x x x x x x x (2)Ax=b,其中A 10×10=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-----41141.........14114114, b 10×1=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--1515...15-15-27- 程序代码:#include<iostream>using namespace std;#include<iomanip>int main(){float a[100],b[100],c[100],x[100];int i,k,N;while(1){int ability=1; //ability 用于判断可不可以执行追赶法的操作cout<<"输入三对角矩阵的维度:"<<endl;cin>>N;cout<<"输入三对角的数据:"<<endl;cin>>b[0]>>c[0]>>x[0];for(i=1;i<N-1;i++) //输入各组数据{cin>>a[i]>>b[i]>>c[i]>>x[i];}cin>>a[N-1]>>b[N-1]>>x[N-1];for(k=0;k<N-1;k++){if(b[k]==0) {cout<<"不可用追赶法解此题!"<<endl;//当对角线上的元素全部为零的时候不可以用追赶法.ability=0;break;}else{ a[k+1]=a[k+1]/b[k];b[k+1]=b[k+1]-a[k+1]*c[k];x[k+1]=x[k+1]-a[k+1]*x[k];//这个过程执行的是消元过程(即追赶法的追):对应于书上的βi=bi-lic(i-1),yi=di-liy(i-1)}}if(ability){x[N-1]=x[N-1]/b[N-1]; //回代法的第一项for(i=N-2;i>=0;i--) //下标从大到小变化,是赶的过程{x[i]=(x[i]-c[i]*x[i+1])/b[i];}cout<<"此方程的解为:"<<endl;for(i=0;i<N;i++){cout<<setiosflags(ios::showpoint);cout<<"x["<<i+1<<"]="<<setiosflags(ios::fixed)<<setprecision(1)<<x[i]<<endl; //保留一位有效数字}}}return 0;}运行结果:。

三对角线性方程组的求解

三对角线性方程组的求解

一、概述三对角线性方程组的求解是许多科学和工程计算中最重要也是最基本的问题之一。

在核物理、流体力学、油藏工程、石油地震数据处理及数值天气预报等许多领域的大规模科学工程和数值处理中都会遇到三对角系统的求解问题。

很多三对角线性方程组的算法可以直接推广到求解块三对角及带状线性方程组。

由于在理论和实际应用上的重要性,近20年来三对角方程组的并行算法研究十分活跃。

大规模科学计算需要高性能的并行计算机。

随着软硬件技术的发展,高性能的并行计算机日新月异。

现今,SMP可构成每秒几十亿次运算的系统,PVP和COW可构成每秒几百亿次运算的系统,而MPP和DSM可构成每秒万亿次运算或更高的系统。

高性能并行计算机只是给大型科学计算提供了计算工具。

如何发挥并行计算机的潜在性能和对三对角系统进行有效求解,其关键在于抓住并行计算的特点进行并行算法的研究和程序的设计与实现。

另外,对处理机个数较多的并行计算系统,在设计并行算法时必须解决算法的可扩展性,并对可扩展性进行研究和分析。

二、问题的提出设三对角线性方程组为AX=Y(1)式中:A∈Rn×n非奇异,αij=0,。

X=(x1,x2,…xn) T Y=(y1,y2,…yn)T。

此系统在许多算法中被提出,因此研究其高性能并行算法是很有理论和实际意义的。

三、并行求解三对角系统的直接解法关于三对角线性方程组的直接求解已经有大量并行算法,其中Wang的分裂法是最早针对实际硬件环境,基于分治策略提出的并行算法。

它不仅通信结构简单,容易推广到一般带状线性方程组的并行求解,而且为相继出现的许多其它并行算法提供了可行的局部分解策略。

近20年来求解三对角方程组的并行算法都是基于分治策略,即通过将三对角方程组分解成P个小规模问题,求解这P个小规模问题,再将这些解结合起来得到原三对角方程组的解。

一般求解三对角方程组的分治方法的计算过程可分为3个阶段:一是消去,每台处理机对子系统消元;二是求解缩减系统(需要通信);三是回代,将缩减系统的解回代到每个子系统,求出最终结果。

三对角法求微分方程组

三对角法求微分方程组

三对角法求微分方程组摘要:1.引言2.三对角法的基本原理3.三对角法求解微分方程组的步骤4.举例说明5.结论正文:1.引言微分方程组在数学和物理学等领域有着广泛的应用,如何有效地求解微分方程组一直是学者们关注的焦点。

近年来,数值计算方法在求解微分方程组方面取得了显著进展。

其中,三对角法作为一种常用的数值计算方法,得到了广泛的应用。

本文将对三对角法求解微分方程组的原理和步骤进行详细介绍。

2.三对角法的基本原理三对角法是一种基于矩阵的三对角分解方法,其基本思想是将求解微分方程组的问题转化为求解一组三对角线性方程组。

具体来说,对于一个n 阶微分方程组,首先将其转化为n 个一阶微分方程,然后通过三对角分解,将这些一阶微分方程转化为一组三对角线性方程组。

最后,通过求解这组三对角线性方程组,得到原微分方程组的解。

3.三对角法求解微分方程组的步骤求解微分方程组的三对角法主要包括以下三个步骤:(1) 构造三对角矩阵。

根据微分方程组的系数矩阵,构造一个三对角矩阵。

具体来说,对于一个n 阶微分方程组,构造一个n×n 的三对角矩阵,其中对角线以下的元素为原方程组系数矩阵的元素,对角线以上的元素为原方程组系数矩阵的转置矩阵的元素。

(2) 求解三对角线性方程组。

通过三对角分解,将原微分方程组转化为一组三对角线性方程组。

然后,利用迭代法(如牛顿法、梯度下降法等)求解这组三对角线性方程组,得到一组近似解。

(3) 得到微分方程组的解。

根据三对角线性方程组的解,可以通过反向替换得到原微分方程组的解。

4.举例说明假设有一个二阶微分方程组:y"(x) = 3x^2 - 2y(x)y"(x) = x^3 - xy(x)采用三对角法求解该微分方程组,首先构造一个三对角矩阵:```[ 3x^2 - 2y(x), 0 ][ 0, x^3 - xy(x) ]```然后,通过三对角分解,将该矩阵分解为两个对角矩阵的乘积:```[ 1, 0, 0 ][ 0, 1, 0 ][ 0, 0, 1 ]```将分解后的矩阵代入原矩阵,得到一组三对角线性方程组:```u"(x) = au(x)v"(x) = bv(x)w"(x) = cw(x)```其中,u(x) = y(x),v(x) = xy(x),w(x) = x^2y(x),a = 3,b = 1,c = 1。

使用C语言解常微分方程 C ODE

使用C语言解常微分方程 C ODE

解常微分方程姓名:Vincent年级:2010,学号:1033****,组号:5(小组),4(大组) 1. 数值方法:我们的实验目标是解常微分方程,其中包括几类问题。

一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。

对待上面的几类问题,我们分别使用不同的方法。

初值问题使用 龙格-库塔 来处理 边值问题 用打靶法来处理 线性边值问题 有限差分法初值问题我们分别使用二阶 龙格-库塔 方法 4阶 龙格-库塔 方法来处理一阶常微分方程。

理论如下:对于这样一个方程'()(,)y t f t y =当h 很小时,我们用泰勒展开,12111111(,)(,)(,)k k k k i i k k j j i ij k hf t y k hf t h y k k hf a b a b t h y h k -===++=++∑当我们选择正确的参数 a[i][j],b[i][j]之后,就可以近似认为这就是泰勒展开。

对于二阶,我们有:()01()()y t h y t h Af Bf+=++其中 010(,)(,)P f f t y f f t y h Qhf ==++经过前人的计算机经验,我们有,选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。

所以我们称其为 龙格(库塔)休恩方法()()()(,)(,(,))2hy t h y t f t y f t h y hf t y +=++++对于4阶龙格方法,我们有类似的想法, 我们使用前人经验的出的系数,有如下公式112341213243(22),6(,),(,),22(,),22(,).n n n n n n n n n n h y y k k k k k f t y h h k f t y k h h k f t y k k f t h y hk +⎧=++++⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩对于高阶微分方程及微分方程组我们用4阶龙格-库塔方法来解对于一个如下的微分方程组'111'1(,,,),(,,,).n nn n y f t y y y f t y y ⎧=⎪⎨⎪=⎩ 101,00,0(),()n n y t y y t y=⎧⎪⎨⎪=⎩ 我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。

最新三对角线性方程组的解法知识讲解

最新三对角线性方程组的解法知识讲解

Jacobi迭代法
1.迭代过程: 对于Ax b ,设A可逆,且对于aii0,i1,2, ,n 令D为A的对角元素部分,则 A(AD )D, 继而对于方程组有 D x(D A )xb,所以有 解 ,令 xD 1(D A )xD 1b B JD 1(D A )D 1(LU ) 为迭代矩阵,fJ D1b。则Jacobi迭代法的迭 代格式为: 。 x(k1) Bjx(k) fJ
二、实验内容
考虑线性方程组:
A xb , A R n n,b R n
其中A为三对角矩阵,编制程序求解该方程组
三、实验要求
(1)考虑不同的数值解法,对方程组进行编程,编写其通用代码; (2)对不同的程序代码用实例进行验证,取矩阵:
2 1 0 0 0 1
1
2
1
0
0
0
A 0 1 2 1 0 ,b 1
0
0 1 2 1
0
0 0 0 1 2 0
x 方程初值 :
(0,0,0,0,0,0)T
0

(3)比较不同方法对求解三对角线性方程组的优异性。
四、实验过程
解法
追赶法
Jacobi迭代法
Gauss迭代法
SOR迭代法
(一)追赶法
• 编程思想:
矩阵的三对角线性方程组是由矩阵的直接三角分解法来推到的 来的,求解பைடு நூலகம்价于解两个三角形方程组:
B w(D w) 1 L (1 (w )D w)U
其中 x(k1) Bwx(k)fw 迭代法
且 fw wb 。当w=1时,SOR法就是Gauss
• SOR方法是Gauss迭代法的一种修正,主要思想是:设已知 x (k )
(1)Ly f ,求y;(2)Ux y ,求x

使用C语言解常微分方程 C ODE

使用C语言解常微分方程 C ODE

解常微分方程姓名:Vincent年级:2010,学号:1033****,组号:5(小组),4(大组)1. 数值方法:我们的实验目标是解常微分方程,其中包括几类问题。

一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。

对待上面的几类问题,我们分别使用不同的方法。

∙ 初值问题使用 龙格-库塔 来处理 ∙ 边值问题用打靶法来处理 ∙ 线性边值问题有限差分法初值问题我们分别使用∙ 二阶 龙格-库塔 方法 ∙ 4阶 龙格-库塔 方法 来处理一阶常微分方程。

理论如下:对于这样一个方程'()(,)y t f t y =当h 很小时,我们用泰勒展开,12111111(,)(,)(,)k k k k i i k k j j i ij k hf t y k hf t h y k k hf a b a b t h y h k -===++=++∑当我们选择正确的参数 a[i][j],b[i][j]之后,就可以近似认为这就是泰勒展开。

对于二阶,我们有:()01()()y t h y t h Af Bf+=++其中010(,)(,)P f f t y f f t y h Qhf ==++经过前人的计算机经验,我们有,选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。

所以我们称其为 龙格(库塔)休恩方法()()()(,)(,(,))2hy t h y t f t y f t h y hf t y +=++++对于4阶龙格方法,我们有类似的想法, 我们使用前人经验的出的系数,有如下公式112341213243(22),6(,),(,),22(,),22(,).n n n n n n n n n n h y y k k k k k f t y h h k f t y k h h k f t y k k f t h y hk +⎧=++++⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩对于高阶微分方程及微分方程组 我们用∙ 4阶龙格-库塔方法来解对于一个如下的微分方程组'111'1(,,,),(,,,).n nn n y f t y y y f t y y ⎧=⎪⎨⎪=⎩ 101,00,0(),()n n y t y y t y=⎧⎪⎨⎪=⎩ 我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)#include<stdio.h>#include<stdlib.h>#include<math.h>#include<graphics.h>float k1,k2,k3,k4,m1,m2,m3,m4,n1,n2,n3,n4;float t,ts,tf,h;float x[1001],y[1001],z[1001],x_axis[1001];int count;void initial( ){x[0] = 1.0 ;y[0] = -1.0;z[0] = 0.0;ts = 0.0;tf = 20.0;count = 500;}void runge( ){int i = 0;h = (tf - ts)/count;for(i = 1;i <= count;i++){t = ts + (i-1)*h;k1 = -x[i-1] + 2*y[i-1] + 6*z[i-1];m1 = -y[i-1] + 3*z[i-1] + 2*sin(t);n1 = -z[i-1] + sqrt(t)*exp(-t) + cos(t);k2 = -(x[i-1] + k1*(h/2.0)) + 2*(y[i-1] + m1*(h/2.0)) + 6*(z[i-1] + n1*(h/2.0));m2 = -(y[i-1] + m1*(h/2.0)) + 3*(z[i-1] + n1*(h/2.0)) + 2*sin(t +h/2.0);n2 = -(z[i-1] + n1*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k3 = -(x[i-1] + k2*(h/2.0)) + 2*(y[i-1] + m2*(h/2.0)) + 6*(z[i-1] + n2*(h/2.0));m3 = -(y[i-1] + m2*(h/2.0)) + 3*(z[i-1] + n2*(h/2.0)) + 2*sin(t +h/2.0);n3 = -(z[i-1] + n2*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k4 = -(x[i-1] + k3*(h/2.0)) + 2*(y[i-1] + m3*(h/2.0)) + 6*(z[i-1] + n3*(h/2.0));m4 = -(y[i-1] + m3*(h/2.0)) + 3*(z[i-1] + n3*(h/2.0)) + 2*sin(t +h/2.0);n4 = -(z[i-1] + n3*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);x[i] = x[i-1] + h*(k1 + 2*k2 + 2*k3 + k4)/6.0;y[i] = y[i-1] + h*(m1 + 2*m2 + 2*m3 + m4)/6.0;z[i] = z[i-1] + h*(n1 + 2*n2 + 2*n3 + n4)/6.0;}}int main( ){int i,j,k,gdriver,gmode;char s[30];initial( );runge( );for(i = 0;i <= count;i++)x_axis[i] = i;gdriver=DETECT; /*图形显示初始化*/initgraph(&gdriver,&gmode,"c:\\tc");setbkcolor(9);outtextxy(240, 40, "Runge Rutta Arithmetic"); /*标题*/ /*outtextxy(400, 445, "THE PRODUCER WANGHUI "); 制作人*/ outtextxy(150, 415, "white is x red is y blue is z"); rectangle(20, 70, 620, 430); /*各种矩形框*/rectangle(20, 70, 620, 410);line(25, 250, 595, 250); /*建立X1轴坐标*/line(595, 250, 590, 248);line(595, 250, 590, 252);outtextxy(580, 255, "t/s");/*line(330, 405, 330, 75); 建立Y1轴坐标line(330, 75, 328, 80);line(330, 75, 332, 80);outtextxy(335, 80, "h/mm");*/line(40,405,40,75); /*建立Y1轴坐标*/line(40,75,38,80);line(40,75,42,80);outtextxy(45, 80, "h/mm");/*sprintf(s, "%d", x[0]);outtextxy(18,445, s);sprintf(s, "%d", x[1]);outtextxy(26,445, s);sprintf(s, "%d", x[2]);outtextxy(34,445, s);sprintf(s, "%d", x[3]);outtextxy(42,445, s);*/for(i = 0;i <= count;i++){putpixel(40 + x_axis[i],250 - 15*x[i],15); putpixel(40 + x_axis[i],250 - 15*y[i],4); putpixel(40 + x_axis[i],250 - 15*z[i],1); setcolor(15);delay(1000); /*延时10000ms,动态输出*/}getch(); return(0); }。

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)

解微分方程算法C语言程序(精心整理版)#include<stdio.h>#include<stdlib.h>#include<math.h>#include<graphics.h>float k1,k2,k3,k4,m1,m2,m3,m4,n1,n2,n3,n4;float t,ts,tf,h;float x[1001],y[1001],z[1001],x_axis[1001];int count;void initial( ){x[0] = 1.0 ;y[0] = -1.0;z[0] = 0.0;ts = 0.0;tf = 20.0;count = 500;}void runge( ){int i = 0;h = (tf - ts)/count;for(i = 1;i <= count;i++){t = ts + (i-1)*h;k1 = -x[i-1] + 2*y[i-1] + 6*z[i-1];m1 = -y[i-1] + 3*z[i-1] + 2*sin(t);n1 = -z[i-1] + sqrt(t)*exp(-t) + cos(t);k2 = -(x[i-1] + k1*(h/2.0)) + 2*(y[i-1] + m1*(h/2.0)) + 6*(z[i-1] + n1*(h/2.0));m2 = -(y[i-1] + m1*(h/2.0)) + 3*(z[i-1] + n1*(h/2.0)) + 2*sin(t +h/2.0);n2 = -(z[i-1] + n1*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k3 = -(x[i-1] + k2*(h/2.0)) + 2*(y[i-1] + m2*(h/2.0)) + 6*(z[i-1] + n2*(h/2.0));m3 = -(y[i-1] + m2*(h/2.0)) + 3*(z[i-1] + n2*(h/2.0)) + 2*sin(t +h/2.0);n3 = -(z[i-1] + n2*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);k4 = -(x[i-1] + k3*(h/2.0)) + 2*(y[i-1] + m3*(h/2.0)) + 6*(z[i-1] + n3*(h/2.0));m4 = -(y[i-1] + m3*(h/2.0)) + 3*(z[i-1] + n3*(h/2.0)) + 2*sin(t +h/2.0);n4 = -(z[i-1] + n3*(h/2.0)) + sqrt(t + h/2.0)*exp(-(t + h/2.0)) + cos(t + h/2.0);x[i] = x[i-1] + h*(k1 + 2*k2 + 2*k3 + k4)/6.0;y[i] = y[i-1] + h*(m1 + 2*m2 + 2*m3 + m4)/6.0;z[i] = z[i-1] + h*(n1 + 2*n2 + 2*n3 + n4)/6.0;}}int main( ){int i,j,k,gdriver,gmode;char s[30];initial( );runge( );for(i = 0;i <= count;i++)x_axis[i] = i;gdriver=DETECT; /*图形显示初始化*/initgraph(&gdriver,&gmode,"c:\\tc");setbkcolor(9);outtextxy(240, 40, "Runge Rutta Arithmetic"); /*标题*/ /*outtextxy(400, 445, "THE PRODUCER WANGHUI "); 制作人*/ outtextxy(150, 415, "white is x red is y blue is z"); rectangle(20, 70, 620, 430); /*各种矩形框*/rectangle(20, 70, 620, 410);line(25, 250, 595, 250); /*建立X1轴坐标*/line(595, 250, 590, 248);line(595, 250, 590, 252);outtextxy(580, 255, "t/s");/*line(330, 405, 330, 75); 建立Y1轴坐标line(330, 75, 328, 80);line(330, 75, 332, 80);outtextxy(335, 80, "h/mm");*/line(40,405,40,75); /*建立Y1轴坐标*/line(40,75,38,80);line(40,75,42,80);outtextxy(45, 80, "h/mm");/*sprintf(s, "%d", x[0]);outtextxy(18,445, s);sprintf(s, "%d", x[1]);outtextxy(26,445, s);sprintf(s, "%d", x[2]);outtextxy(34,445, s);sprintf(s, "%d", x[3]);outtextxy(42,445, s);*/for(i = 0;i <= count;i++){putpixel(40 + x_axis[i],250 - 15*x[i],15); putpixel(40 + x_axis[i],250 - 15*y[i],4); putpixel(40 + x_axis[i],250 - 15*z[i],1); setcolor(15);delay(1000); /*延时10000ms,动态输出*/}getch(); return(0); }。

三对角法求微分方程组

三对角法求微分方程组

三对角法求微分方程组
(原创版)
目录
1.三对角法的基本概念
2.三对角法的求解步骤
3.三对角法的应用实例
正文
一、三对角法的基本概念
三对角法是一种求解常系数线性微分方程组的数值方法。

这种方法是基于线性代数的三对角矩阵,通过将微分方程组转化为三对角矩阵的形式,然后求解该矩阵的特征值和特征向量,从而得到微分方程组的解。

二、三对角法的求解步骤
1.对角化:将微分方程组转化为三对角矩阵的形式。

具体操作是先求出系数矩阵的行列式,然后通过初等变换将系数矩阵化为上三角矩阵,再通过求逆矩阵将上三角矩阵转化为三对角矩阵。

2.求解特征值和特征向量:对于三对角矩阵,求解其特征值和特征向量较为简单。

特征值即为对角线上的元素,特征向量可通过对角线上的元素进行求解得到。

3.求解微分方程组:根据特征值和特征向量,可以得到微分方程组的解。

具体操作是将特征向量作为基底,将初始条件代入得到对应的特征值,从而得到微分方程组的解。

三、三对角法的应用实例
假设有一个二阶常系数线性微分方程组:
y" + 2y + p(t) = 0
z" + z + q(t) = 0
其系数矩阵为:
[1, 2]
[0, 1]
通过三对角法求解该微分方程组,首先对系数矩阵进行对角化,然后求解特征值和特征向量,最后代入初始条件求解得到微分方程组的解。

总之,三对角法是一种有效的求解常系数线性微分方程组的数值方法,适用于各种实际问题。

三对角行列式解法

三对角行列式解法

三对角行列式解法三对角行列式是指一个下三角矩阵和与其交错对角线相对的上三角矩阵构成的矩阵。

在矩阵中,非对角线的元素均为0,对角线上有一个由称作主对角线的元素构成的数列d1,d2,…,dn,以及上(下)主对角线之上(下)有一个由称作附属对角线的元素构成的数列e1,e2,…,en-1(d1,dn和e1,en-1均不为0)。

一个n x n 矩阵是三对角的,如果其主对角线上的元素都不为0,且其与主对角线距离为±1的点构成的所有对角线上的元素都不为0。

三对角矩阵出现在高斯消元以及数值微分方程求解等许多问题中的矩阵。

三对角行列式的求解方法主要有两种:迭代和消元法。

一、迭代法设矩阵A的行列式为D,矩阵A可以写作三个矩阵的积(分块矩阵分解):A = LDU,其中L是下三角矩阵,D是对角矩阵,U是上三角矩阵。

于是可以有以下的求解过程:1.将A写成LDU的形式,D为:d1 e1 0 0e1 d2 e2 00 e2 d3 0... ... ... ... ...0 ... 0 en-1 dn其中di和ei是原三对角矩阵的主对角线和附属对角线的元素。

2.求解矩阵D对应的行列式:D= d1d2d3...dn - d1e12d3...dn +(e12d2)e23d4...dn - (e12d2)(e23d3)e34...dn + ... + (-1)n-1(e12d2)(e23d3)...(en-1dn-1)3.利用迭代法将LDU中的三个矩阵分别变为:L = I + l1u1 + l2u2 + … + ln-1un-1D = DU = I + u1l1 + u2l2 + … + un-1ln-1其中I是单位矩阵,l和u分别表示L和U的第i列和第i行,l1,l2,…,ln-1和u1,u2,…,un-1为按某种方式求出的系数。

4.将LDU的式子分别乘上L和U,得到矩阵A的分解式:5.将A的分解式展开,得到A的行列式表示式。

矩阵四种分解:PALU,QR,Household,Givens的c程序

矩阵四种分解:PALU,QR,Household,Givens的c程序

modu=sqrt((*(arrt+i*n+j))*(*(arrt+i*n+j))+modu*modu); } for(i=j;i<m;i++) //求单次的R矩阵 for(l=j;l<m;l++) { *(R+i*m+l)=-2*(*(arrt+i*n+j))*(*(arrt+l*n+j))/modu/modu; } for(i=j;i<m;i++) { *(R+i*m+i)=1+(*(R+i*m+i)); } for(i=0;i<j;i++) for(l=0;l<m;l++) { if(i==l) { *(R+i*m+l)=1; } else { *(R+i*m+l)=*(R+l*m+i)=0; } } matrixmul(R,H,Rsum,m,m,m); for(i=0;i<m;i++) for(l=0;l<m;l++) { *(H+i*m+l)=*(Rsum+i*m+l); } matrixmul(Rsum,arr,arrt,m,m,n); } for(i=0;i<m;i++) for(l=0;l<m;l++) { *(RT+i*m+l)=*(Rsum+l*m+i); }
#include "stdio.h" #include "malloc.h" #include "math.h" void ScanMatrix(float *arr,int m,int n); //输入矩阵 void matrixmul(float*arr1,float*arr2,float*arr3,int m,int n,int k); //矩阵 数乘函数 void printm(char c,float*arr,int m,int n); //矩阵打印函数 void PALU(float *arr,int m,int n); //PA=LU分解函数 void Gram_Schmint(float *arr,int m,int n); //QR分解函数 void Household(float *arr,int m,int n); //household分解 函数 void Givens(float *arr,int m,int n); //givens分解函数 void divide(); //分解矩阵总函数 int main() { divide(); return 0; } void divide() { int m,n,method,flag=1; char c='0'; while(c!='#') { printf("请输入mXn矩阵维度m:"); scanf("%d",&m); printf("请输入mXn矩阵维度n:"); scanf("%d",&n); float *arr= (float *)malloc(sizeof (float) * m*n); ScanMatrix(arr,m,n); while(flag) { printf("请输入矩阵的分解方式:\n1-PA=LU,\n2-Gram-Schmit正交化 A=QR,\n3-Household分结束分解.\n"); scanf("%d",&method); switch(method)

三对角线线性方程组的解法

三对角线线性方程组的解法

再解 UX=Y,得到公式
角线上,根据其系数矩阵的特点,可以利用高斯消元法将三对角线

矩阵分解后,可求解相应的三对角线方程组。
2 三对角线矩阵的分解公式及其求解方程组的算法
线性方程组
3 例子
例:解线性方程组
解:由 公 式 ③ 计 算 出: ,
从而得
其中,
由公式④计算出: ①角线线性方程组
中图分类号: G 6 2 3 . 5
文献标识码: A
文章编号: 1 6 7 4 - 0 9 8 X ( 2 0 0 8 ) 0 7 ( c ) - 0 1 5 9 - 0 1
1 引言
在数值计算中,会遇到一种特殊的方程组,它的系数矩阵是三 对角线矩阵,即它的非零元素集中在主对角线及其相邻的两条对
学 术 论 坛
科技创新导报 2008 NO.21
Science and Technology Innovation Herald
三对角线线性方程组的解法
王艳天 (辽阳职业技术学院 辽宁辽阳 1 1 1 0 0 4 )
摘 要: 由三对角线矩阵的特点, 得出系数矩阵的分解公式. 从而给出了的三对角线线性方程组的求解方法。
;(2)
(3)
时,矩阵 A 可分解成 A=LU=
由公式⑤计算出
原方程组的解为
4 结语
此算法的优点是将矩阵 A 直接分解,不需用高斯消元法逐个消 元并回代,特别是当 n 较大时,计算量大大低于高斯消元法计算量。

其中
由①给出, 且分解是唯一的。( 因篇幅
有限,证明从略) 将②式右端按矩阵乘法展开并与 A 相等,得

科技创新导报 Science and Technology Innovation Herald

使用C语言解常微分方程 C ODE

使用C语言解常微分方程 C ODE

解常微分方程姓名:Vincent年级:2010,学号:1033****,组号:5(小组),4(大组)1. 数值方法:我们的实验目标是解常微分方程,其中包括几类问题。

一阶常微分初值问题,高阶常微分初值问题,常微分方程组初值问题,二阶常微分方程边值问题,二阶线性常微分方程边值问题。

对待上面的几类问题,我们分别使用不同的方法。

• 初值问题使用 龙格-库塔 来处理 • 边值问题用打靶法来处理 • 线性边值问题有限差分法初值问题我们分别使用• 二阶 龙格-库塔 方法 • 4阶 龙格-库塔 方法 来处理一阶常微分方程。

理论如下:对于这样一个方程'()(,)y t f t y =当h 很小时,我们用泰勒展开,12111111(,)(,)(,)k k k k i i k k j j i ij k hf t y k hf t h y k k hf a b a b t h y h k -===++=++∑L当我们选择正确的参数 a[i][j],b[i][j]之后,就可以近似认为这就是泰勒展开。

对于二阶,我们有:()01()()y t h y t h Af Bf+=++其中010(,)(,)P f f t y f f t y h Qhf ==++经过前人的计算机经验,我们有,选择 A=1/2,B=1/2,则 P=1,Q=1,于是又如下形式,这也使休恩方法的表达式。

所以我们称其为 龙格(库塔)休恩方法()()()(,)(,(,))2hy t h y t f t y f t h y hf t y +=++++对于4阶龙格方法,我们有类似的想法, 我们使用前人经验的出的系数,有如下公式112341213243(22),6(,),(,),22(,),22(,).n n n n n n n n n n h y y k k k k k f t y h h k f t y k h h k f t y k k f t h y hk +⎧=++++⎪⎪=⎪⎪⎪=++⎨⎪⎪=++⎪⎪=++⎪⎩对于高阶微分方程及微分方程组 我们用• 4阶龙格-库塔方法来解对于一个如下的微分方程组'111'1(,,,),(,,,).n nn n y f t y y y f t y y ⎧=⎪⎨⎪=⎩L LL 101,00,0(),()n n y t y y t y=⎧⎪⎨⎪=⎩L我们可以认为是一个一阶向量微分方程,所以可以用龙格-库塔方法的向量形式解。

三对角矩阵(TridiagonalMatrices)的求法:ThomasAlgorithm。。。

三对角矩阵(TridiagonalMatrices)的求法:ThomasAlgorithm。。。

三对⾓矩阵(TridiagonalMatrices)的求法:ThomasAlgorithm。

做三次样条曲线时,需要解三对⾓矩阵(Tridiagonal Matrices)。

常⽤解法为Thomas Algorithm,⼜叫The tridiagonal matrix algorithm (TDMA)。

它是⼀种基于⾼斯消元法的算法,分为两个阶段:向前消元forward elimination和回代backward substitution。

本⽂以⼀个6乘6矩阵为例,介绍⼀下使⽤TDMA的求解过程。

1.范例求解步骤1:将矩阵变为上三⾓矩阵⾸先要把上⾯公式中的系数矩阵变为⼀个上三⾓矩阵。

第⼀⾏:将上式除以b1:可写作:所以矩阵⽅程可写为:第⼆⾏:将变换后的第⼀⾏乘以a2,再与第⼆⾏相减,即可消去x1,得:所以新的矩阵⽅程为:同理可推,第三⾏:第四⾏:第五⾏:第六⾏:最后得到新的上三⾓矩阵公式为:步骤2:求解x逆序可以求出,如下:2. ⼀般性公式:注意:使⽤TDMA求解,系数矩阵需时diagonally dominant,即:3. 实现代码(C语⾔)void tdma(float x[], const size_t N, const float a[], const float b[], float c[]) {size_t n;c[0] = c[0] / b[0];x[0] = x[0] / b[0];for (n = 1; n < N; n++) {float m = 1.0f / (b[n] - a[n] * c[n - 1]);c[n] = c[n] * m;x[n] = (x[n] - a[n] * x[n - 1]) * m;}for (n = N - 1; n-- > 0; )x[n] = x[n] - c[n] * x[n + 1];}。

计算方法数值分析C语言源程序

计算方法数值分析C语言源程序

第1章线性方程组的直接算法求解线性方程组的直接算法是基于矩阵分解的算法。

常见的矩阵分解有两种:1.矩阵的三角分解矩阵的三角就是把一个矩阵分解成两个三角形矩阵的乘积。

比如:简单的三角分解:,这里,是单位下三角矩阵,是上三角矩阵。

列主元三角分解:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。

全主元三角分解:,这里,,是初等置换阵,是单位下三角矩阵且元素的模不超过,是上三角矩阵。

2.矩阵的正交三角分解正交化三角化就是把一个矩阵分解成一个正交矩阵和一个上三角矩阵的乘积.即,这里是正交矩阵,是上三角矩阵.1.1 矩阵的三角分解1.1.1 功能把实矩阵分解成单位下三角形矩阵和上三角形矩阵的乘积.即.该算法适用于各阶顺序主子式不等于的矩阵.1.1.2 算法概述所谓三角分解就是把阶方阵作如下分解其中是单位下三角矩阵,上三角矩阵。

当时,构造Gauss变换则以此类推,只要对角线上的元素,便可以一直这样做下去。

直到将其化为上三角矩阵为止。

即有.其中,且从而有而且.综上所述,我们可以将两个矩阵因子继续存储在原矩阵的存储空间上.的主对角线上的1不予存储.算法5.3(计算三角分解:Gauss消去法)1.1.3 算法程序1.1.3.1.1 参数说明**a n阶矩阵; n 矩阵的阶;1.1.3.1.2 C程序bool GaussLU(double **a,int n)//n阶矩阵的LU分解{for(int k=0;k<n-1;k++){if(a[k][k]==0)return false;for(int i=k+1;i<n;i++){a[i][k]/=a[k][k];for(int j=k+1;j<n;j++)a[i][j]-=a[i][k]*a[k][j];}}return true;}1.1.4 例题求矩阵1 2 3 41 4 9 161 8 27 64的三角分解,结果如下:1 2 3 41 2 6 121 3 6 241 7 6 241.2 列主元三角分解1.2.1 功能用矩阵的列主元三角分解,分解矩阵:,这里,是初等置换阵,是单位下三角矩阵且各元素的模不超过1,是上三角矩阵。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>
#include<math.h>
#define N 1000
//三对角方程组Thomas算法,计算两点边值问题
//-u"(x)+u(x)=exp(x)(sin(x)-cos(x),0<=x<=pi
//u(00=0, u(pi)=0.
void ThomasMethodsf(double a[],double b[],double c[],double d[],int n);
//Thomas算法函数
void Errorf(double x[],double d[],double e[],double *maxe_h,int n);
//计算结点处数值解的误差的绝对值和数值解的最大误差函数
void prtf(double a[],double b[],double c[],double d[],int n);
//打印三对角方程组系数矩阵函数
double fi(double xi);//微分方程右端项
//double qi(double xi);//微分方程u(x)系数
double ui(double xi);//微分方程精确解u(x)
void res(double d[],double e[],double maxe_h,int n);//输出结果到Result.txt文档
void main()
{
double a[N];//系数矩阵左下非零元素集合,顺序从左到右,从上到下
double b[N];//系数矩阵对角线元素集合,顺序同上
double c[N];//系数矩阵右上非零元素集合,顺序同上
double d[N];//方程组常数项集合
double x[N];//网格节点集合
double e[N];//误差
double maxe_h=0;//最大误差
double *p_1,*p_2,*p_3;//*p_1指向数组d[N],*p_2指向数组e[N],*p_3指向maxe_h double h;//网格步长
int m;//求解区间等分度
int n;//系数矩阵阶数
int i;
printf("请输入求解区间等分度:\nm=");
scanf("%d",&m);
h=3.1415926/m;
n=m-1;
for(i=1;i<m;i++)//系数矩阵和常数项赋值
{
x[i]=i*h;
a[i]=-1;
b[i]=2+h*h;
c[i]=-1;
d[i]=h*h*fi(x[i]);
}
p_1=d;
ThomasMethodsf(a,b,c,p_1,n);
p_2=e;
p_3=&maxe_h;
Errorf(x,d,p_2,p_3,n);
res(d,e,maxe_h,n);
printf("Reslut:\n");
for(i=(n+1)/5;i<=n;i=i+(n+1)/5)
printf("u%d=%f\n",i,d[i]);
printf("\n");
return;
}
double fi(double xi)
{
double fx;
fx=exp(xi)*(sin(xi)-2*cos(xi));
return fx;
}
/*double qi(double xi)
{
}*/
double ui(double xi)
{
double ux;
ux=exp(xi)*sin(xi);
return ux;
}
void ThomasMethodsf(double a[],double b[],double c[],double d[],int n) {
int j;
double p;
// prtf(a,b,c,d,n);
if(fabs(b[1])<1e-15)//判断系数矩阵是否为奇异矩阵函数
{
printf("Error: Matrix A is sigular.");
return;
}
c[1]=c[1]/b[1];//追
d[1]=d[1]/b[1];
for(j=2;j<n;j++)
{
p=b[j]-a[j]*c[j-1];
if(fabs(b[j])<1e-15)//判断系数矩阵是否为奇异矩阵函数
{
printf("Error: Matrix A is sigular.");
return;
}
c[j]=c[j]/p;
d[j]=(d[j]-a[j]*d[j-1])/p;
}
p=b[n]-a[n]*c[n-1];//赶
if(fabs(b[n])<1e-15)//判断系数矩阵是否为奇异矩阵函数
{
printf("Error: Matrix A is sigular.");
return;
}
d[n]=(d[n]-a[n]*d[n-1])/p;
for(j=n-1;j>=1;j--)
d[j]=d[j]-c[j]*d[j+1];
}
void res(double d[],double e[],double maxe_h,int n)
{
FILE *fp;
int j;
if((fp=fopen("Result.txt","a"))==NULL)//打开文件
{
printf("Connot open this file.");
return;
}
fprintf(fp,"m=%d时的数值解:\n",n+1);
for(j=1;j<=n;j=j++)
{
fprintf(fp,"u%d=%f ",j,d[j]);//写入文件
}
fprintf(fp,"\n对应数值解的误差的绝对值:\n");
for(j=1;j<=n;j=j++)
{
fprintf(fp,"%10.3e ",e[j]);//写入文件
}
fprintf(fp,"\n数值解的最大误差:%10.3e\n\n",maxe_h);
fclose(fp);//关闭文件
}
void Errorf(double x[],double d[],double e[],double *maxe_h,int n) {
int i;
for(i=1;i<=n;i++)
{
e[i]=fabs(ui(x[i])-d[i]);
if(e[i]>*maxe_h)
*maxe_h=e[i];
}
}
void prtf(double a[],double b[],double c[],double d[],int n)
{
int i,j;
printf("Coefficient Matrix:\n");
printf("%f %f \n",b[1],c[1]);
printf("%f %f %f\n",a[2],b[2],c[2]);
for(j=3;j<n;j++)
{
for(i=2;i<j;i++)
printf(" ");
printf("%f %f %f\n",a[j],b[j],c[j]);
}
for(i=2;i<n;i++)
printf(" ");
printf("%f %f\n",a[n],b[n]);
printf("Constant:\n");
for(j=1;j<=n;j++) printf("%f ",d[j]);
printf("\n");
}。

相关文档
最新文档