program main
implicit none
real::x1=-1,y1=-1,x2=1,y2=-1,x3=1,y3=1,x4=-1,y4=1
real:: x=0,y=0
real::m=0,n=0
!read(*,*)x1,y1,x2,y2,x3,y3,x4,y4
!read(*,*)x,y
call iteration(x1,y1,x2,y2,x3,y3,x4,y4,x,y,m,n)
write(*,*)m,n
pause
end
subroutine Jacobi(x1,y1,x2,y2,x3,y3,x4,y4,m,n,a,b,c,d)
implicit none
real:: a,b,c,d,m,n
real:: x1,y1,x2,y2,x3,y3,x4,y4
a=(x1*(-1+n)+x2*(1-n)+x3*(1+n)+x4*(-1-n))/4
b=(y1*(-1+n)+y2*(1-n)+y3*(1+n)+y4*(-1-n))/4
c=(x1*(-1+m)+x2*(-1-m)+x3*(1+m)+x4*(1-m))/4
d=(y1*(-1+m)+y2*(-1-m)+y3*(1+m)+y4*(1-m))/4
end subroutine Jacobi
subroutine shapefunction(m,n,N1,N2,N3,N4)
implicit none
real:: m,n,N1,N2,N3,N4
N1=(1-m)*(1-n)/4
N2=(1+m)*(1-n)/4
N3=(1+m)*(1+n)/4
N4=(1-m)*(1+n)/4
end subroutine shapefunction
subroutine iteration(x1,y1,x2,y2,x3,y3,x4,y4,x,y,m,n)
real::x0,y0,condition1,condition2,m0,n0,m,n
real::N1=0,N2=0,N3=0,N4=0
real::a=0,b=0,c=0,d=0
real,dimension(2,2)::J
do
call shapefunction(m,n,N1,N2,N3,N4)
x0=N1*x1+N2*x2+N3*x3+N4*x4
y0=N1*y1+N2*y2+N3*y3+N4*y4
call Jacobi(x1,y1,x2,y2,x3,y3,x4,y4,m,n,a,b,c,d)
J(1,1)=d/(a*d-b*c)
J(1,2)=-b/(a*d-b*c)
J(2,1)=-c/(a*d-b*c)
J(2,2)=a/(a*d-c*b)
m0=m+J(1,1)*(x-x0)+J(1,2)*(y-y0)
n0=n+J(2,1)*(x-x0)+J(2,2)*(y-y0)
condition1=m0-m
condition2=n0-n
if(abs(condition1)<0.001.and.abs(condition2)<0.001) then
m=m0
n=n0
exit
else
m=m0
n=n0
endif
enddo
end subroutine iteration
fcode 发表于 2015-11-12 10:54
既然是迭代,那m n 应该有初值。
hipeilei 发表于 2015-11-12 11:20
老大,这里m=o,n=0,结果是0,0,不管怎么取值永远都是0,0.
QQ截图20151112114541.png (25.37 KB, 下载次数: 426)
fcode 发表于 2015-11-12 11:43
你作弊。之前你给的代码里并没有对 m n 赋予初值。
你后来修改了。我使用你修改后的代码,得到了 0.0 和 ...
li913 发表于 2015-11-12 11:35
程序运行结果不对,这种情况是逻辑错误,也就是算法写错了,只有熟悉算法才能解决。所以,详细描述你的算法 ...
360截图20151112183841171.jpg (24.32 KB, 下载次数: 487)
kerb 发表于 2015-11-12 18:48
好像是有限元等参变换,似乎你搞反了,实际上是变换到空间,应该是四种组合,但是你写成x1=,y1=...x4=,y4=. ...
kerb 发表于 2015-11-13 00:16
另外用迭代法求解非线性方程组应该是这样
kerb 发表于 2015-11-12 23:42
好像可以解出两个坐标系变换,稍微麻烦一点
hipeilei 发表于 2015-11-13 23:37
这样解出来可能会有两个根,取舍问题不好判断,有可能两个点都在规则单元里。 ...
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) | Powered by Discuz! X3.2 |