當前位置:首頁 » 操作系統 » 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

熱點內容
學cnc數控編程 發布:2024-10-27 11:04:56 瀏覽:226
mallat演算法 發布:2024-10-27 11:03:57 瀏覽:33
講腳本 發布:2024-10-27 10:47:54 瀏覽:713
存儲免疫細胞 發布:2024-10-27 10:46:56 瀏覽:493
粉標溯源碼 發布:2024-10-27 10:44:28 瀏覽:139
網吧伺服器如何搭建 發布:2024-10-27 10:27:49 瀏覽:391
安卓手機如何設置不讓玩王者榮耀 發布:2024-10-27 10:27:43 瀏覽:762
沒有配置的游戲怎麼玩 發布:2024-10-27 10:25:32 瀏覽:431
c語言好看 發布:2024-10-27 10:14:25 瀏覽:604
java寫入數組 發布:2024-10-27 10:06:59 瀏覽:178