- ベストアンサー
風の水平、鉛直成分から風向を計算できない理由
- 風の水平成分と鉛直成分の値が入ったファイルを使って風向を求める方法について質問があります。
- 現在使用しているコマンドや式に問題がある可能性があります。
- Excelで同じ計算を行った場合には正しく結果が得られたことがわかりました。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
実行したとき、エラーメッセージは出てないですか? Linuxということで、awkはGNU awkだと思いますが、手許のGNU Awk 4.0.2では gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0} gawk: コマンドライン:1: ^ syntax error gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0} gawk: コマンドライン:1: ^ syntax error gawk: コマンドライン:1: {if($1>0){print(90-atan($2/$1)*180/M_PI())+180}else if($1<0)print{(90-atan($2/$1)*180/M_PI())}else 0} gawk: コマンドライン:1: ^ syntax error と、間違いの箇所を指摘してくれます。(ここのシステムの関係上、スペースがまとめられてしまいますが、実際は^sytan errorの位置が、間違い箇所の下にあります) 現在のものは、単純な{}の間違いがあります。 これを修正すると、次に gawk: コマンドライン:1: (FILENAME=- FNR=1) 致命的: 関数 `atan' は定義されていません とエラーが出ます。 マニュアルを読むと、たしかに「atan」という関数は定義されていません。ついでに、「M_PI」という関数もありません。 http://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html#Numeric-Functions tanの逆関数は、 atan2を使います。 atan(y/x) = atan2(y,x) です。 また、同じところに、πとして atan2(-1,0) を使う、というのがあります。 atan2はatanに比べて優れている点があります。 atanでは、x<0,y<0 と x>0,y>0 の区別ができないうえ、x=0の時は計算不能でした。そのためにxの正負によって+180しているはずです。 # ちなみに、$1=0のとき、実際は$2>0なら90,$2<0なら-90が答えになるはずです。 # どちらも 0になっているのは間違いです。 atan2では、x<0,y<0 と x>0,y>0 を区別し、それぞれの象限にあった角度を返します。x=0のときもyに対応してちゃんと±π/2を返します。よって、$1によって条件分けする必要がなく {print (90-atan2($2,$1)*180/atan2(0,-1) +180) } これだけで済みます。 なお、atant2(0,0)=0になります。実際は、無風で、角度も無いはずですが、上記では 90度という答えになります。 これをこのままにするか、場合分けして強制的に特別な値にするかは、目的に合せてください。 ちなみに。Excelにもatan2があります。これを使うと同様にif関数を使わずに記述できます。
お礼
上手いこと出来ました。 ご丁寧にどうもありがとうございました!