Fortran Coder

查看: 8994|回复: 3
打印 上一主题 下一主题

[求助] 老师可不可以棒忙看一下,不知道哪里的原因但是结果总...

[复制链接]

15

帖子

6

主题

0

精华

入门

F 币
73 元
贡献
45 点
跳转到指定楼层
楼主
发表于 2016-4-8 18:41:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是用有限元法计算一维常系数常微分方程,不知道哪里出错,但是结果跟我用手算的不一样,谢谢老师
[Fortran] 纯文本查看 复制代码
001program mytp24
002implicit none
003integer i,j,n,l,k
004double precision h,alpha
005double precision,allocatable::a(:,:),akl(:,:),b(:),bkl(:),phi(:),x(:) ,a1(:),b1(:),c1(:),f(:),u(:)
006write(6,*)'input un nombre n'
007read(5,*)n
008write(6,*)'input un nombre alpha'
009read(5,*)alpha
010allocate(a(n,n),akl(n,n),b(n),bkl(n),x(n),a1(n),b1(n),c1(n),f(n),u(n))
011h=1.d0/n
012x(1)=0
013do i=1,n
014x(i)=(i-1)*h
015end do
016a(1:n,1:n)=0
017b(1:n)=0
018b(1)=-alpha
019call Integ(h,x,akl,f,n)
020do i=1,n
021    do j=1,n
022    akl(i,j)=akl(i,j)
023    bkl(i)=f(i)
024enddo
025end do
026do l=1,2
027    do k=1,n
028    i=k+l-1
029    j=k+l-1
030if(i/=n+1.and.j/=n+1) then
031a(i,j)=a(i,j)+akl(i,j)
032elseif(i/=n+1) then
033b(i)=b(i)+bkl(i)
034endif
035enddo
036enddo
037    do i=1,n
038     write(6,'("(",i3,")=",d15.8)')i,b(i)
039        do j=1,n
040        write(6,'("(",i3,",",i3,")=",d15.8)')i,j,a(i,j)
041        enddo
042        enddo
043do i=1,n
044    b1(i)=a(i,i)
045    enddo
046    do i=2,n
047    a1(i)=a(i,i-1)
048    enddo
049    do i=1,n-1
050       c1(i)=a(i,i+1)
051    end do
052    do i=1,n
053    f(i)=b(i)
054    enddo
055    a1(1)=0
056    c1(n)=0
057    u(n)=0
058    open(25,file='le solution de u(x).txt')
059    call tridag(a1,b1,c1,f,u,n)
060    do i=1,n
061    write(6,'("(",i3,")=",d15.8)')i,u(i)
062    write(25,*)'le solution de u(x)',u(i)
063    end do
064    close(25)
065pause
066end program mytp24
067 
068subroutine Integ(h,x,akl,f,n)
069implicit none
070integer i,n,j
071double precision h,x(n),a,b,akl(n,n),f(n),c,alpha
072a=h*(1.d0/2.d0-1.d0/(2.d0*3.d0**(0.5d0)))
073b=h*(1.d0/2.d0+1.d0/(2.d0*3.d0**(0.5d0)))
074x(1)=0
075c=1
076do i=1,n
077x(i)=(i-1)*h
078enddo
079    akl(1,1)=h/2.d0*((-(x(1)+a)/h+1)**2+((-x(1)+b)/h+1)**2)+1.d0/h
080    f(1)=c*h/2.d0*((-(x(1)+a)/h+1)+((-x(1)+b)/h+1))+alpha
081    do i=1,n
082    f(i+1)=c*h/2.d0*((-(x(1)+a)/h+1)+((-x(1)+b)/h+1))
083    do j=1,n
084    if(i==j)then
085    akl(i,j)=h/2.d0*(((x(i-1)+a)/h-i+2)**2+((x(i-1)+b)/h-i+2)**2)+h/2.d0*((-(x(i)+a)/h+i)**2+((-x(i)+b)/h+i)**2)+2.d0/h
086    elseif(i==j+1) then
087    akl(i,j)=h/2.d0*(-(x(j)+a)/h+i)*(-(x(j)+a)/h+j)+h/2.d0*(-(x(j)+b)/h+i)*(-(x(j)+b)/h+j)-1.d0/h
088    elseif(i+1==j) then
089    akl(i,j)=h/2.d0*(-(x(i)+a)/h+i)*(-(x(i)+a)/h+j)+h/2.d0*(-(x(i)+b)/h+i)*(-(x(i)+b)/h+j)-1.d0/h
090    else
091    akl(i,j)=0
092    endif
093    enddo
094    enddo
095    open(26,file='les matrix a et b.txt')
096       do i=1,n
097       write(6,'("(",i3,")=",d15.8)')i,f(i)
098        do j=1,n
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)
101        enddo
102        enddo
103        close(26)
104    end subroutine integ
105 
106subroutine tridag(a1,b1,c1,f,u,n)
107implicit none
108integer n,j
109double precision gam(n),a1(n),b1(n),c1(n),u(n),f(n),bet
110if (b1(1)==0.) pause 'b(1)=0 dans tridag'
111 bet=b1(1)
112u(1)=f(1)/bet
113do j=2,n
114    gam(j)=c1(j-1)/bet
115    bet=b1(j)-a1(j)*gam(j)
116    if (bet==0.) pause 'bet=0 dans tridag'
117    u(j)=(f(j)-a1(j)*u(j-1))/bet
118end do
119do j=n-1,1,-1
120    u(j)=u(j)-gam(j+1)*u(j+1)
121end do
122 end subroutine tridag
123 
124 double precision function Fbase(x,phi,dphi,n)
125 integer i,j,n
126 double precision phi(n,n),dphi(n,n),x(n+1)
127 do i=1,n
128    do j=1,n
129    phi(1,1)=(-x(1)/h+1)**2
130    dphi(1,1)=1.d0/h
131 if(i+1==j+1)then
132   phi(i,j)=(x(i)/h-i+2)**2+(x(i+1)/h+i+1)**2
133   dphi(i,j)=2.d0/h
134   else if(i+1==j)then
135   phi(i,j)=(x(i)/h+i)*(x(j)/h+j)
136   dphi(i,j)=-1.d0/h
137   else if(i==j+1)then
138   phi(i,j)=(x(j)/h+j)*(x(i)/h+i)
139   dphi(i,j)=-1.d0/h
140   else
141   phi(i,j)=0
142   dphi(i,j)=0
143   endif
144   enddo
145   enddo
146   end function Fbase

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2016-4-9 08:21:40 | 只看该作者
计算结果不一致的问题,别人帮不了你。
因为,别人不知道什么才是你希望的,正确的结果。

对于编译器和代码来说,只要能算完,都认为是正确的。不符合你的预期,那是另外的问题。
我们并不知道你的预期,所以无法帮你。

不过,你可以自行学习如何 debug 单步调试:详见:
http://debug.w.fcode.cn
http://v.fcode.cn/video-debugger.html

15

帖子

6

主题

0

精华

入门

F 币
73 元
贡献
45 点
板凳
 楼主| 发表于 2016-4-9 17:56:34 | 只看该作者
我昨天弄好了,少加了一个循环,谢谢老师,单步调试听起来很酷的样子,马上看起来,谢谢老师每次都回的这么及时

15

帖子

6

主题

0

精华

入门

F 币
73 元
贡献
45 点
地板
 楼主| 发表于 2016-4-9 18:03:21 | 只看该作者
单步debug 好东西啊,以前只看了课程可能没看仔细这些,(因为我们老师只丢了好多材料不知道从哪下手,所以就看了你们的视频)感恩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-29 13:42

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表