当前位置:首页 » 操作系统 » fortran算法集

fortran算法集

发布时间: 2022-05-26 02:36:30

⑴ 求教fortran高斯积分 实现下面式子。

以下代码 FLRGS 函数,来自于徐世良的算法集。

Program Bai_Thlws
Implicit None
Real*8 g
call FLRGS( 0.0D0 , 2.0D0 , F , 0.001D0 , g )
write( * , * ) g
Contains
Real*8 Function F( x )
Real*8 x
F = x ** 2.0D0
End Function F
Subroutine FLRGS(A,B,F,EPS,G)
Real*8 :: T(5),C(5)
Real*8 :: A,B,F,G,S,P,H,AA,BB,W,X,Q,EPS
DATA T/-0.9061798459,-0.5384693101,0.0,0.5384693101,0.9061798459/
DATA C/0.2369268851,0.4786286705,0.5688888889,0.4786286705,0.2369268851/
Integer :: M , I , J
M=1
S=(B-A)*0.001
P=0.0
10H=(B-A)/M
G=0.0
DO 30 I=1,M
AA=A+(I-1)*H
BB=A+I*H
W=0.0
DO 20 J=1,5
X=((BB-AA)*T(J)+(BB+AA))/2.0
W=W+F(X)*C(J)
20 CONTINUE
G=G+W
30CONTINUE
G=G*H/2.0
Q=ABS(G-P)/(1.0+ABS(G))
IF ((Q.GE.EPS).AND.(ABS(H).GT.ABS(S))) THEN
P=G
M=M+1
GOTO 10
END IF
RETURN
End Subroutine FLRGS
End Program Bai_Thlws

⑵ fortran 语言矩阵连乘的算法

fortran下的矩阵相乘直接用.x.就行了。
比如

real(kind=8)::a(4,4),b(4,4)

则a,b相乘就是a .x. b
就这么简单,你弄个循环就ok了。

⑶ Fortran语言与算法是什么

Fortran 已经相当古老了,现在很少领域在用,它早于C好长时间,但其以数学计算出名,多用于科学计算领域,但现在在科学计算领域优于Fortran的语言已经好多了,例如你用C或Fortran计算数值时还要考虑上限溢出问题,但用python则多大的东西都能计算(现在NASA的科学计算已经广泛采用python,python是一款较新的语言,相当强大),至于算法,则不分语言,一个算法可以用相当多的语言实现,一种语言实现一个算法也会有相当多的方法..................

⑷ FORTRAN语言程序问题

#include? " iostream "
using ? namespace ?std;

class ?Matrix
{
private :
? double ** ?A;?????? // 矩阵A
? double ? * b;??????? // 向量b
public :
? int ?size;
?Matrix( int ?);
? ~ Matrix();
friend? double * ?Dooli(Matrix & ?);
? void ?Input();
? void ?Disp();

} ;

Matrix::Matrix( int ?x)
{
?size = x;

? // 为向量b分配空间并初始化为0
?b = new ? double ?[x];
? for ( int ?j = 0 ;j < x;j ++ )
??b[j] = 0 ;

? // 为向量A分配空间并初始化为0
?A = new ? double * ?[x];
? for ( int ?i = 0 ;i < x;i ++ )
??A[i] = new ? double ?[x];
? for ( int ?m = 0 ;m < x;m ++ )
?? for ( int ?n = 0 ;n < x;n ++ )
???A[m][n] = 0 ;
}

Matrix:: ~ Matrix()
{
????cout << " 正在析构中~~~~ " << endl;
????delete?b;
???? for ( int ?i = 0 ;i < size;i ++ )
????????delete?A[i];
????delete?A;
}

void ?Matrix::Disp()
{
? for ( int ?i = 0 ;i < size;i ++ )
? {
?? for ( int ?j = 0 ;j < size;j ++ )
???cout << A[i][j] << " ?? " ;
??cout << endl;
?}
}

void ?Matrix::Input()
{
?cout << " 请输入A: " << endl;
? for ( int ?i = 0 ;i < size;i ++ )
?? for ( int ?j = 0 ;j < size;j ++ ) {
???cout << " 第 " << i + 1 << " 行 " << " 第 " << j + 1 << " 列: " << endl;
??cin >> A[i][j];
??}
???cout << " 请输入b: " << endl;
? for ( int ?j = 0 ;j < size;j ++ ) {
??cout << " 第 " << j + 1 << " 个: " << endl;
???cin >> b[j];
?}
?
}
?
double * ?Dooli(Matrix & ?A)
{
? double ? * Xn = new ? double ?[A.size];
?Matrix?L(A.size),U(A.size);

? // 分别求得U,L的第一行与第一列
??? for ( int ?i = 0 ;i < A.size;i ++ )
??????U.A[ 0 ][i] = A.A[ 0 ][i];
??? for ( int ?j = 1 ;j < A.size;j ++ )
??????L.A[j][ 0 ] = A.A[j][ 0 ] / U.A[ 0 ][ 0 ];

// 分别求得U,L的第r行,第r列
????? double ?temp1 = 0 ,temp2 = 0 ;
? for ( int ?r = 1 ;r < A.size;r ++ ) {
????? // U
????? for ( int ?i = r;i < A.size;i ++ ) {
????????? for ( int ?k = 0 ;k < r - 1 ;k ++ )
????????????temp1 = temp1 + L.A[r][k] * U.A[k][i];?
????????????U.A[r][i] = A.A[r][i] - temp1;
?????}
????? // L
????? for ( int ?i = r + 1 ;i < A.size;i ++ ) {
?????????? for ( int ?k = 0 ;k < r - 1 ;k ++ )
????????????temp2 = temp2 + L.A[i][k] * U.A[k][r];
?????????????L.A[i][r] = (A.A[i][r] - temp2) / U.A[r][r];
?????}
?}
?cout << " 计算U得: " << endl;
?U.Disp();
?cout << " 计算L的: " << endl;
?L.Disp();
?
? double ? * Y = new ? double ?[A.size];

?Y[ 0 ] = A.b[ 0 ];
? for ( int ?i = 1 ;i < A.size;i ++ ?) {
????? double ?temp3 = 0 ;
????? for ( int ?k = 0 ;k < i - 1 ;k ++ )
?????????temp3 = temp3 + L.A[i][k] * Y[k];
?????Y[i] = A.b[i] - temp3;
?}

?Xn[A.size - 1 ] = Y[A.size - 1 ] / U.A[A.size - 1 ][A.size - 1 ];
? for ( int ?i = A.size - 1 ;i >= 0 ;i -- ) {
????? double ?temp4 = 0 ;
????? for ( int ?k = i + 1 ;k < A.size;k ++ )
?????????temp4 = temp4 + U.A[i][k] * Xn[k];
?????Xn[i] = (Y[i] - temp4) / U.A[i][i];
?}
?
return ?Xn;
}
?
int ?main()
{
?Matrix?B( 4 );
?B.Input();
? double ? * X;
?X = Dooli(B);
?cout << " ~~~~解得: " << endl;
? for ( int ?i = 0 ;i < B.size;i ++ )
?????cout << " X[ " << i << " ]: " << X[i] << " ? " ;
?cout << endl << " 呵呵呵呵呵 " ;
? return ? 0 ;
}
总结:
在VC2005下编译通过的,VC6.0的

将高斯消去法改写为紧凑形式,可以直接从矩阵 A 的元素的导计算 L , U 元素的递推公式,而不需任何中间步骤,一旦实现了矩阵 A 的 U , L 分解那么就等价于求解两个三角形方程组。

? 注意: 编成语言中的数组以 ’0’ 为首元素,数组的一位偏移最容易出错;

???????????? 注意变量的作用域;

⑸ 求书~~~Visual Fortran 常用数值算法集

http://www.toopoo.com/book/tushu/03-010217-7_mulu.html
电子数下载地址
http://download.csdn.net/source/393882

⑹ 数据结构是否有fortran语言版的

老大,fortran现在都很少有用了,数据结构课本都用的是C++或者至少是C语言的了,也有用Java的。要fortran语言版的数据结构课本你可以到旧书店看看

⑺ 用fortran编写程序 求一个4*4矩阵的逆矩阵 急!

矩阵求拟是一个复杂的问题。
矩阵是否满秩?实数还是复数?
用什么方法?求唯一逆,还是广义逆?

以下是徐世良的算法集,Brinv.for(二维实矩阵高斯消去求拟法)

SUBROUTINE BRINV(A,N,L,IS,JS)
DIMENSION A(N,N),IS(N),JS(N)
DOUBLE PRECISION A,T,D
L=1
DO 100 K=1,N
D=0.0
DO 10 I=K,N
DO 10 J=K,N
IF (ABS(A(I,J)).GT.D) THEN
D=ABS(A(I,J))
IS(K)=I
JS(K)=J
END IF
10 CONTINUE
IF (D+1.0.EQ.1.0) THEN
L=0
WRITE(*,20)
RETURN
END IF
20 FORMAT(1X,'ERR**NOT INV')
DO 30 J=1,N
T=A(K,J)
A(K,J)=A(IS(K),J)
A(IS(K),J)=T
30 CONTINUE
DO 40 I=1,N
T=A(I,K)
A(I,K)=A(I,JS(K))
A(I,JS(K))=T
40 CONTINUE
A(K,K)=1/A(K,K)
DO 50 J=1,N
IF (J.NE.K) THEN
A(K,J)=A(K,J)*A(K,K)
END IF
50 CONTINUE
DO 70 I=1,N
IF (I.NE.K) THEN
DO 60 J=1,N
IF (J.NE.K) THEN
A(I,J)=A(I,J)-A(I,K)*A(K,J)
END IF
60 CONTINUE
END IF
70 CONTINUE
DO 80 I=1,N
IF (I.NE.K) THEN
A(I,K)=-A(I,K)*A(K,K)
END IF
80 CONTINUE
100 CONTINUE
DO 130 K=N,1,-1
DO 110 J=1,N
T=A(K,J)
A(K,J)=A(JS(K),J)
A(JS(K),J)=T
110 CONTINUE
DO 120 I=1,N
T=A(I,K)
A(I,K)=A(I,IS(K))
A(I,IS(K))=T
120 CONTINUE
130 CONTINUE
RETURN
END

⑻ fortran中阶乘算法

http://www.fcode.cn/algorithm-50-1.html
我也不太理解,我是问的大神,论坛那有专门的讲解,你看看吧

⑼ fortran语言矩阵求逆

! aa为原矩阵,b为存放aa的逆矩阵,n为矩阵aa的维数
subroutine nizhen(aa,b,n)
integer n,i,j,k
real:: aa(n,n),b(n,n),a(n,n)
a=aa
do i=1,n
b(i,i)=1
enddo
do i=1,n
b(i,:)=b(i,:)/a(i,i)
a(i,i:n)=a(i,i:n)/a(i,i)
do j=i+1,n
do k=1,n
b(j,k)=b(j,k)-b(i,k)*a(j,i)
enddo
a(j,i:n)=a(j,i:n)-a(i,i:n)*a(j,i)
enddo
enddo
do i=n,1,-1
do j=i-1,1,-1
do k=1,n
b(j,k)=b(j,k)-b(i,k)*a(j,i)
enddo
enddo
enddo
end

⑽ 用fortran软件编制程序,计算矩阵的行列式。要求使用子程序进行模块化编程

求矩阵行列式是一个复杂的过程。有很多很多算法来做,但是各有适用性。有的不适合病态矩阵等等。

以下是一个简单的全选主元高斯消去法。

摘自徐世良的《Fortran常用算法集》

Program Main
Implicit None
Real(8) :: rm(3,3) = reshape( (/1,2,4,5,7,3,13,5,7/) , (/3,3/) )
Real(8) :: rDet
call BSDet( rm , 3 , rDet )
write(*,*) rDet
End Program Main

SUBROUTINE BSDET(A,N,DET)
DIMENSION A(N,N)
DOUBLE PRECISION A,DET,F,D,Q
F=1.0
DET=1.0
DO 100 K=1,N-1
Q=0.0
DO 10 I=K,N
DO 10 J=K,N
IF (ABS(A(I,J)).GT.Q) THEN
Q=ABS(A(I,J))
IS=I
JS=J
END IF
10 CONTINUE
IF (Q+1.0.EQ.1.0) THEN
DET=0.0
RETURN
END IF
IF (IS.NE.K) THEN
F=-F
DO 20 J=K,N
D=A(K,J)
A(K,J)=A(IS,J)
A(IS,J)=D
20 CONTINUE
END IF
IF (JS.NE.K) THEN
F=-F
DO 30 I=K,N
D=A(I,JS)
A(I,JS)=A(I,K)
A(I,K)=D
30 CONTINUE
END IF
DET=DET*A(K,K)
DO 50 I=K+1,N
D=A(I,K)/A(K,K)
DO 40 J=K+1,N
40 A(I,J)=A(I,J)-D*A(K,J)
50 CONTINUE
100 CONTINUE
DET=F*DET*A(N,N)
RETURN
END

热点内容
cochrane数据库 发布:2024-10-27 13:19:39 浏览:807
WCL算法 发布:2024-10-27 13:13:29 浏览:293
解压手写板怎么做 发布:2024-10-27 13:06:25 浏览:927
pythonetree 发布:2024-10-27 12:48:32 浏览:195
cmd非默认端口ftp 发布:2024-10-27 12:41:56 浏览:121
android无线网卡 发布:2024-10-27 12:36:07 浏览:772
零基础c语言入门 发布:2024-10-27 12:20:45 浏览:689
相机在哪里设置密码 发布:2024-10-27 12:20:44 浏览:371
sql存储过程exec 发布:2024-10-27 12:17:14 浏览:405
安卓怎么取 发布:2024-10-27 12:11:02 浏览:995