|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
问题:
对于一个网格,已知四顶点的坐标和四顶点处的流体密度值,求网格内某点(给定坐标)的密度值。
如图,四顶点标记为1,2,3,4,网格内点标记为P。注意1,2,3,4点可以组成任意凸四边形。
(1)
/\
/ \
/ \
/ 。 \
(2) \ (P)/ (3)
\ /
\ /
\/
(4)
设想一个逻辑坐标系,在该坐标系内四顶点的坐标分别为:1(1,1),2(0,1),3(1,0),4(0,0)
如果能够根据实际坐标值求得P点在逻辑坐标系内的坐标P(a,b) (|a|<=1,|b|<=1),那么可以采用双线性插值法[Rho(x) 表示 x 点的密度]:
Rho(P) = (1-a)(1-b) x Rho(4) + (1-a)b x Rho(2) + a(1-b) x Rho(3) + ab x Rho(1)
现在的问题是:已知实际坐标(x1,y1),(x2,y2),(x3,y3),(x4,y4),(xP,yP),怎样求a,b ?
下面是一段FORTRAN格式的程序,用于求a,b
subroutine Calcab()
d_max = 1.d-8 !收敛条件
maxiter = 20 !最大循环次数
a = 0.5
b = 0.5
c a,b可以给定任意0到1之间的初值
d_x_xie = 0.5*(x1-x2+x3-x4)
d_y_xie = 0.5*(y1-y2+y3-y4)
d_x_eta = 0.5*(x1-x3+x2-x4)
d_y_eta = 0.5*(y1-y3+y2-y4)
deta = d_x_xie*d_y_eta - d_y_xie*d_x_eta
rden = 1.0/deta
test = d_max*abs(deta)
iter = 0
11 continue
a1 = 1.0 - a
b1 = 1.0 - b
s1 = a*b
s2 = a1*b
s3 = a*b1
s4 = a1*b1
d_x = x1*s1 + x2*s2 + x3*s3 + x4*s4 - xp
d_y = y1*s1 + y2*s2 + y3*s3 + y4*s4 - yp
a = a + (d_y*d_x_eta - d_x*d_y_eta)*rden
b = b + (d_x*d_y_xie - d_y*d_x_xie)*rden
if (d_x**2 + d_y**2 .le. test) go to 10
iter = iter + 1
if (iter.lt.maxiter) goto 11
10 continue
write(*,*) 'a:', a, ' b:',b
if (iter.ge.maxiter) then
write(*,*) '未收敛'
stop
endif
end
请指点:这段程序是我从其他代码里抠出来的,只知道作用,不知道原理,请哪一位知道的指点一二,谢谢! |
|