主题:重复,迭代,循环?
tianhy2010
[专家分:60] 发布于 2010-10-17 11:50:00
变量定义:
integer:: m=4,n=3
complex t0(2*m,2*m),t1(2*m,2*m),tt(2*m,2*m),t2(2*m,2*m),tt_(2*m,2*m),t3(2*m,2*m),t4(2*m,2*m) ,t(2*m,2*m),t5(2*m,2*m)
complex energy1(2*m,2*m),identity(2*m,2*m) !w用energy1表示
complex h0(2*m,2*m),h2(2*m,2*m),h1(2*m,2*m) !都是已知矩阵,且h0表示H00,h1表示(H01+),h2表示H01,tt表示ti,tt_表示ti_。
这样循环看下好不好:
t0=energy1-h0
t0=.i.t0
t0=t0.x.h2 !求t0,初始值
tt=t0 !第一个t0值
t1=energy1-h0
t1=.i.t1
t1=t1.x.h1 !求t0_,初始值
t2=t1 !将第一个t1赋给t2保存
do i=2,u !循环,计算第i个t0值
t4=-t1.x.t0
t5=-t0.x.t1
t4=identity+t4+t5
t4=.i.t4
t0=t4.x.(t0**2) !ti
t2=t2.x.t0
tt=tt+t2
t1=t4.x.(t1**2) !t1_
! if(all(t1<eps*fi) .and. all(t0<eps*fi)) exit
t2=t2.x.t1
end do
t0=energy1-h0
t0=.i.t0
t0=t0.x.h2 !求t0,初始值
t2=t0
t1=energy1-h0
t1=.i.t1
t1=t1.x.h1 !求t0_,初始值
tt_=t1
do i=2,u
t3=-t1.x.t0
t5=-t0.x.t1
t3=identity+t5+t3
t3=.i.t3
t1=t3.x.(t1**2) !ti_
t2=t2.x.t1
tt_=tt_+t2
t0=t3.x.(t0**2) !ti
! if(all(t1<eps*fi) .and. all(t0<eps*fi)) exit
t2=t2.x.t0
end do
最后更新于:2010-10-17 12:54:00
回复列表 (共21个回复)
沙发
jstzhurj [专家分:4680] 发布于 2010-10-17 13:31:00
矩阵自乘不能用**2,我早在另一个帖子说了。
板凳
happyzq [专家分:30] 发布于 2010-10-17 14:37:00
学习啦!
3 楼
tianhy2010 [专家分:60] 发布于 2010-10-17 14:55:00
[quote]矩阵自乘不能用**2,我早在另一个帖子说了。[/quote]
忘记了,用.x. 吗?
4 楼
tianhy2010 [专家分:60] 发布于 2010-10-17 14:59:00
[quote]矩阵自乘不能用**2,我早在另一个帖子说了。[/quote]
[em8][em8][em8][em8][em8][em7][em7][em7][em6][em6][em6][em5][em5][em5][em2][em2][em2]
这样循环有错吗?
5 楼
tianhy2010 [专家分:60] 发布于 2010-10-17 15:31:00
[quote]矩阵自乘不能用**2,我早在另一个帖子说了。[/quote]
复数矩阵也可以用 .x. 表示矩阵相乘的吧?
6 楼
jstzhurj [专家分:4680] 发布于 2010-10-17 16:09:00
简单平方,只是各个元素自己平方,完全不是矩阵运算法则,用个简单的复数矩阵检验一下。
7 楼
tianhy2010 [专家分:60] 发布于 2010-10-17 17:21:00
[quote]简单平方,只是各个元素自己平方,完全不是矩阵运算法则,用个简单的复数矩阵检验一下。[/quote]
[em15][em15][em15]
大姐麻烦看下,我这样循环能满足公式条件吗?
8 楼
jstzhurj [专家分:4680] 发布于 2010-10-17 17:36:00
T的公式我怎么就看不出规律呢?
9 楼
tianhy2010 [专家分:60] 发布于 2010-10-17 18:36:00
以T为例,第一项 t0,第二项t0~.x.t1,t0~下面加~表示头上加~;第三项 t0~.x.t1~.x.t2;第四项 t0~.x.t1~.x.t2~.x.t3,依次类推,初值T=t0,将t0,t0~带入ti,ti~公式,i每循环一次,得到一组t和t~,将它们带入T公式中求T。
10 楼
jstzhurj [专家分:4680] 发布于 2010-10-17 23:14:00
循环看上去很乱,费很大劲看不清楚,早建议你声明一个包含复数矩阵的type,再用type定义一个复数矩阵数组。这样去运算看起来就清晰多了。
integer,parameter :: Max=1000,i
type cpx
complex,dimension(8,8) :: a
complex,dimension(8,8) :: b
end type cpx
type(cpx),dimension(Max) :: t
引用的时候
t(:).a 用于存放一个序列的复数矩阵。
t(:).b 用于存放这个序列的复数矩阵的共轭。
再写程序,循环就是针对下标了,应该就清晰多了,试试吧。
我来回复