爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 39305|回复: 53

[分享资料] 传说版主,利用u,v计算风向的代码似乎有bug

[复制链接]

新浪微博达人勋

发表于 2012-1-24 01:04:31 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 海蓝蓝 于 2012-3-1 09:05 编辑

窃以为,不管什么象限,算风向,下面这一句就够了。
define dire=180+atan2(u,v)*180/pi'

一下是版主在画斜温图的gs里面的一段,应该是计算风向吧。似乎有点问题?
比如,u=10m/s,v= -1m/s,这时候,风向应该是276度,西北风。可是下面代码算出来是366度。
----------------------------------------
'define uv=mag(vgrdprs,ugrdprs)'
'define pi=3.14159'
if (ugrdprs>=0.)
if (vgrdprs>=0.)
'define dir=180+atan2(ugrdprs,vgrdprs)*180/pi'
endif
endif
if (vgrdprs<=0.)
if (ugrdprs>=0.)
'define dir=270+atan2(ugrdprs,vgrdprs)*180/pi'
endif
endif
if (ugrdprs<=0.)

if (vgrdprs>=0.)
'define dir=180-atan2(ugrdprs,vgrdprs)*180/pi'
endif
endif
if (vgrdprs<0.)
if (ugrdprs<=0.)
'define dir=270-atan2(ugrdprs,vgrdprs)*180/pi'
endif
endif

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-11-16 10:11:10 | 显示全部楼层
本帖最后由 bighug 于 2012-11-16 21:48 编辑

atan2函数的值域是多少?我从网上找到一个fortran函数的日志,说此值域是-π~π,但正常反正切函数的值域应该是-π/2~π/2。对atan2函数不够了解,所以不知道你的答案对不对,我个人认为不对。我是用正常的反正切函数atan(v/u)来算的:
FORTRAN:
if (u>0..and.v>0.) dir=270-atan(v/u)*180/pi
if (u<0..and.v>0.) dir=90-atan(v/u)*180/pi
if (u<0..and.v<0.) dir=90-atan(v/u)*180/pi
if (u>0..and.v<0.) dir=270-atan(v/u)*180/pi
if (u==0..and.v>0.) dir=180
if (u==0..and.v<0.) dir=0
if (u>0..and.v==0.) dir=270
if (u<0..and.v==0.) dir=90
if (u==0..and.v==0.) dir=999
其中uv等于零的五种情况要单独挑出来,不然程序会有瑕疵。atan函数换成atand函数的话直接是度数,不用*180/pi
我四个象限和轴都试了,应该没错。
最需要注意的问题,一个是函数值域,另一个是uv矢量方向和风向是反着的,并且风向角度数是从正Y轴开始顺时针算,和三角函数里度数从正X轴开始逆时针算不一样。
密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

发表于 2019-3-11 15:31:31 | 显示全部楼层
我觉得用matlab的话可以这样:
wd=90-atan2(v,u)*180/pi
wd(wd<0)=wd(wd<0)+360
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2012-1-24 12:20:26 | 显示全部楼层
uv 转风向风速的确需要用4个象限分别计算。
楼主,你可以自己用坐标系画示意图,然后用三角函数计算下。其实上述函数就是实现这个步骤,你可以查查u>0,v<0的条件,看看是不是三角函数用错了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-1-24 12:27:24 | 显示全部楼层
我以前用VB写过的,忘记了这个是不是最终的版本,楼主可以参考下。当时我就是把每个象限的画出来,然后用三角函数。呵呵。

  1.                 temp2(st_nn,3)=mid(read_line(i),20,6)  'U
  2.                 temp2(st_nn,4)=mid(read_line(i),26,6)  'V


  3. if temp2(st_nn,3)<0 and temp2(st_nn,4)<0 then '第1象限
  4. deg=cint(atn(temp2(st_nn,3)/temp2(st_nn,4))*180/3.1415926)
  5. end if
  6. if temp2(st_nn,3)<=0 and temp2(st_nn,4)>0 then '第2象限
  7. deg= 180-cint(atn(abs(temp2(st_nn,3))/abs(temp2(st_nn,4)) )*180/3.1415926)
  8. end if
  9. if temp2(st_nn,3)>0 and temp2(st_nn,4)>=0 then '第3象限
  10. deg=270-cint(atn(abs(temp2(st_nn,4))/abs(temp2(st_nn,3)) )*180/3.1415926)
  11. end if
  12. if temp2(st_nn,3)>0 and temp2(st_nn,4)<0 then '第4象限
  13. deg=cint(atn(abs(temp2(st_nn,4))/abs(temp2(st_nn,3)) )*180/3.1415926)+270
  14. end if
复制代码

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-1-24 12:30:33 | 显示全部楼层
上面的代码,是2009年写的了。。。现在没有数据了,没办法测试到底对不对。
你就用这个参考下UV转风向风速的思路吧。希望别误导你。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-1-24 12:48:14 | 显示全部楼层
本帖最后由 海蓝蓝 于 2012-1-24 12:48 编辑

已经验证了啊。
比如,u=10m/s, v= - 1m/s,  这时候,风向应该是276度,西北风。可是那个代码算出来是366度!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-1-24 12:48:49 | 显示全部楼层

已经验证了啊。
比如,u=10m/s, v= - 1m/s,  这时候,风向应该是276度,西北风。可是那个代码算出来是366度!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-1-24 13:07:41 | 显示全部楼层
孤蓝et 发表于 2012-1-24 12:20
uv 转风向风速的确需要用4个象限分别计算。
楼主,你可以自己用坐标系画示意图,然后用三角函数计算下。其 ...

窃以为,不管什么象限,算风向,下面这一句就够了。
define dire=180+atan2(u,v)*180/pi'
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-1-24 21:19:14 | 显示全部楼层
海蓝蓝 发表于 2012-1-24 13:07
窃以为,不管什么象限,算风向,下面这一句就够了。
define dire=180+atan2(u,v)*180/pi'.{:eb302:}真不知道啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-1-24 22:05:52 | 显示全部楼层
孤蓝et 发表于 2012-1-24 21:19
海蓝蓝 发表于 2012-1-24 13:07
窃以为,不管什么象限,算风向,下面这一句就够了。
define dire=180+at ...

哎,你试试就知道了。随便举几个例子,一个象限一个。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-1-28 20:12:06 | 显示全部楼层
海蓝蓝 发表于 2012-1-24 22:05
哎,你试试就知道了。随便举几个例子,一个象限一个。

早点发觉这个就好了。。。。。
看来当年数学、几何都没有学好。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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