|
这是用有限元法计算一维常系数常微分方程,不知道哪里出错,但是结果跟我用手算的不一样,谢谢老师
[Fortran] 纯文本查看 复制代码 004 | double precision h , alpha |
005 | double precision , allocatable :: a ( : , : ) , akl ( : , : ) , b ( : ) , bkl ( : ) , phi ( : ) , x ( : ) , a 1 ( : ) , b 1 ( : ) , c 1 ( : ) , f ( : ) , u ( : ) |
006 | write ( 6 , * ) 'input un nombre n' |
008 | write ( 6 , * ) 'input un nombre alpha' |
010 | allocate ( a ( n , n ) , akl ( n , n ) , b ( n ) , bkl ( n ) , x ( n ) , a 1 ( n ) , b 1 ( n ) , c 1 ( n ) , f ( n ) , u ( n ) ) |
019 | call Integ ( h , x , akl , f , n ) |
030 | if ( i /= n +1 .and. j /= n +1 ) then |
031 | a ( i , j ) = a ( i , j ) + akl ( i , j ) |
038 | write ( 6 , '("(",i3,")=",d15.8)' ) i , b ( i ) |
040 | write ( 6 , '("(",i3,",",i3,")=",d15.8)' ) i , j , a ( i , j ) |
058 | open ( 25 , file = 'le solution de u(x).txt' ) |
059 | call tridag ( a 1 , b 1 , c 1 , f , u , n ) |
061 | write ( 6 , '("(",i3,")=",d15.8)' ) i , u ( i ) |
062 | write ( 25 , * ) 'le solution de u(x)' , u ( i ) |
068 | subroutine Integ ( h , x , akl , f , n ) |
071 | double precision h , x ( n ) , a , b , akl ( n , n ) , f ( n ) , c , alpha |
072 | a = h * ( 1 .d 0 / 2 .d 0 -1 .d 0 / ( 2 .d 0 * 3 .d 0 * * ( 0.5d0 ) ) ) |
073 | b = h * ( 1 .d 0 / 2 .d 0 +1 .d 0 / ( 2 .d 0 * 3 .d 0 * * ( 0.5d0 ) ) ) |
079 | akl ( 1 , 1 ) = h / 2 .d 0 * ( ( - ( x ( 1 ) + a ) / h +1 ) * * 2 + ( ( - x ( 1 ) + b ) / h +1 ) * * 2 ) +1 .d 0 / h |
080 | f ( 1 ) = c * h / 2 .d 0 * ( ( - ( x ( 1 ) + a ) / h +1 ) + ( ( - x ( 1 ) + b ) / h +1 ) ) + alpha |
082 | f ( i +1 ) = c * h / 2 .d 0 * ( ( - ( x ( 1 ) + a ) / h +1 ) + ( ( - x ( 1 ) + b ) / h +1 ) ) |
085 | akl ( i , j ) = h / 2 .d 0 * ( ( ( x ( i -1 ) + a ) / h - i +2 ) * * 2 + ( ( x ( i -1 ) + b ) / h - i +2 ) * * 2 ) + h / 2 .d 0 * ( ( - ( x ( i ) + a ) / h + i ) * * 2 + ( ( - x ( i ) + b ) / h + i ) * * 2 ) +2 .d 0 / h |
087 | akl ( i , j ) = h / 2 .d 0 * ( - ( x ( j ) + a ) / h + i ) * ( - ( x ( j ) + a ) / h + j ) + h / 2 .d 0 * ( - ( x ( j ) + b ) / h + i ) * ( - ( x ( j ) + b ) / h + j ) -1 .d 0 / h |
089 | akl ( i , j ) = h / 2 .d 0 * ( - ( x ( i ) + a ) / h + i ) * ( - ( x ( i ) + a ) / h + j ) + h / 2 .d 0 * ( - ( x ( i ) + b ) / h + i ) * ( - ( x ( i ) + b ) / h + j ) -1 .d 0 / h |
095 | open ( 26 , file = 'les matrix a et b.txt' ) |
097 | write ( 6 , '("(",i3,")=",d15.8)' ) i , f ( i ) |
099 | write ( 6 , '("(",i3,",",i3,")=",d15.8)' ) i , j , akl ( i , j ) |
100 | write ( 26 , * ) 'les matrix a et b' , i , j , akl ( i , j ) , i , f ( i ) |
106 | subroutine tridag ( a 1 , b 1 , c 1 , f , u , n ) |
109 | double precision gam ( n ) , a 1 ( n ) , b 1 ( n ) , c 1 ( n ) , u ( n ) , f ( n ) , bet |
110 | if ( b 1 ( 1 ) == 0 . ) pause 'b(1)=0 dans tridag' |
115 | bet = b 1 ( j ) - a 1 ( j ) * gam ( j ) |
116 | if ( bet == 0 . ) pause 'bet=0 dans tridag' |
117 | u ( j ) = ( f ( j ) - a 1 ( j ) * u ( j -1 ) ) / bet |
120 | u ( j ) = u ( j ) - gam ( j +1 ) * u ( j +1 ) |
122 | end subroutine tridag |
124 | double precision function Fbase ( x , phi , dphi , n ) |
126 | double precision phi ( n , n ) , dphi ( n , n ) , x ( n +1 ) |
129 | phi ( 1 , 1 ) = ( - x ( 1 ) / h +1 ) * * 2 |
132 | phi ( i , j ) = ( x ( i ) / h - i +2 ) * * 2 + ( x ( i +1 ) / h + i +1 ) * * 2 |
135 | phi ( i , j ) = ( x ( i ) / h + i ) * ( x ( j ) / h + j ) |
138 | phi ( i , j ) = ( x ( j ) / h + j ) * ( x ( i ) / h + i ) |
|
|