あらきけいすけのメモ帳

あらきけいすけの雑記帳2

こどもといっしょに簡単なゲームプログラムを pygame で書いた

f:id:arakik10:20180322183954p:plain
最近、うちの子が「ゲームプログラミング」を熱く語るので、簡単なゲームプログラムを Python 3.6.3 + pygame 1.9.3 で作った。目の前でちょっとずつ作ってみせつつ、ときどきコピペをやらせて変数名やパラメータを書き換えさせる。ゲームパッド(の左レバー)で「自機(赤い正方形)」を操作しながら、ランダムに逃げ回る「獲物(青い正方形)」を60秒以内に何度も捕まえる「鬼ごっこゲーム」スクリプトpygame ライブラリだと「窓枠を作る」「窓枠内に絵を描く」「ジョイスティックのデータを取る」「クロックを使う」といった基本機能の API が大抵あるので、LEGO みたい。

import pygame
import numpy

pygame.init()
screen = pygame.display.set_mode((240,180))
pygame.display.set_caption("My Game")
font=pygame.font.SysFont('Calibri',25,True,False)
clock = pygame.time.Clock()

posRect= [120-10, 90+10, 20, 20]
posRect0= [120-5, 90+5, 10, 10]
x=0
y=0
x0=0
y0=0
score=0
timeRemain=600

try:
    j = pygame.joystick.Joystick(0)
    j.init()
    print( 'Joystickの名称: ' + j.get_name())
    print( 'ボタン数 : ' + str(j.get_numbuttons()))
except pygame.error:
    print('Joystickが見つかりませんでした。')

done = False
while not done:

    screen.fill((255,255,255))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        if event.type == pygame.JOYAXISMOTION:
            u , v = j.get_axis(0), j.get_axis(1)
            if int(u*10)+int(v*10) != 0:
                x= x + int(u*10)
                y= y + int(v*10)
                if x > 100:
                    x= 100
                if x < -100:
                    x= -100
                if y > 80:
                    y= 80
                if y < -80:
                    y= -80
                posRect= [120-10+x, 90-10+y, 20, 20]

    r= numpy.random.rand(2)
    speed= 0.5
    x0= x0 + int(r[0]*20-10)*speed
    y0= y0 + int(r[1]*20-10)*speed
    if x0 > 100:
        x0= 100
    if x0 < -100:
        x0= -100
    if y0 > 80:
        y0= 80
    if y0 < -80:
        y0= -80
    posRect0= [120-5+x0, 90-5+y0, 10, 10]

    if (x0 - x)**2 + (y0 - y)**2 < 150:
        score= score + 1

    pygame.draw.rect(screen, (255,0,0), posRect, 2)
    pygame.draw.rect(screen, (0,0,255), posRect0, 2)

    timeRemain= timeRemain - 1
    text= font.render(str(score)+' '+str(timeRemain),True,(0,0,0))
    screen.blit(text,[0,0])
    pygame.display.flip()

    if timeRemain == 0:
        pygame.time.wait(10000)
        done = True

    clock.tick(10)

pygame.quit()

参考にしたページ
Joystickの入力を取得する - 強火で進め
Program Arcade Games With Python And Pygame Chapter 5: Introduction to Graphics

n乗根、あるいは「量」と「量の値」に関するとりとめのない素人考え

  • 2016.1.27の日記をgdgdと考え直す…
  • 大学教養程度の数学のコンテンツを高校数学の教程まで遡りつつ考えると、n乗根(\sqrt[n]{a}=a^{1/n})がいきなり暗黙のうちに実数の連続性を前提している強烈な「天下り式」であることに気付いてから考え始めた。
  • 「数の位取り記法」と「量」の区別を考える。
  • \sqrt3は「量」と「操作」を表しており、 操作(\sqrt3)^2=3を通して「量の計算の体系」に組み込まれている。
  • 「量」を「数の位取り記法」で表現することで「量」としての大きさの概算ができる。
  • 「量の計算」と「位取り記法を用いた量の値の計算」を区別して考える
  • 「量」を「数の位取り記法」で表現するアルゴリズムがいくつかある。
  • たとえば1/3=0.333...は小学校で学習するわり算の筆算、 すなわち量としての「商」を「数の10進位取り記法」で表現するアルゴリズムを実行すると、 アルゴリズムが止まらない例になっている。
  • 例えば「開平計算」や「バビロニアアルゴリズム+わり算の筆算」を用いて、 \sqrt3の「10進の位取り記法」1.732...を得ることができるが、 アルゴリズムは止まらないことがこれらのアルゴリズムとは別の論理から論理的に分かるし、 アルゴリズム自体に自動停止する機構は組み込まれていない。
  • 「数」と「量」を区別して考えるとき、 分数の計算ルールは「量」の計算体系。
  • 「計量・計測」の分野では "quantity value" 「量の値」という表現があるよなあ。 「量」があって「真の値」を持つけれど、その値の「精度」は測定の方法によるし、 その「精度」の制限内で「測定値」を知り得るに過ぎない。 「量」と「数の位取り記法」の一つの接点である。
  • 「数」あるいは「数の位取り記法」のルールとして確立された 「算法(たし算、ひき算、かけ算、わり算)」が、 「量」の計算に拡張されているということなのか?
  • 離散量にしても連続量にしても量の「単位」を抱えている。
  • 例えば身長1.5mならば「長さの次元を持つ量である"mという単位"の1.5倍」という意味。 だから単位とは分数で書いて計算を進めるときに、分母、分子に現れたら約分をして無次元化しないといけない量。
  • 連続量の中に「数の位取り記法」に対して 記数アルゴリズムが「止まるもの」 「止まらないが『周期的』な動作になるもの」 「止まらないし『周期的』にもならないもの」 の3種類に分類される。
  • \sqrt2の計算で (1.1)^3\lt(1.01)^{34}\lt(1.001)^{346}\lt(1.0001)^{3465}\lesssim\sqrt{2}=2^{1/2} では指数の桁が1個ずつ増えて収拾がつかなくなるので、 「数の位取り記法」を悪用して、指数法則(a^m)^n=a^{mn}が小数でも利用できると前提して、 ((1.1)^{10})^{0.3}\lt((1.01)^{100})^{0.34}\lt((1.001)^{1000})^{0.346}\lt((1.0001)^{10000})^{0.3465}\lesssim\sqrt{2}=2^{1/2} とおいて指数を規格化すると\sqrt2に対応する指数は 0.3465... に収束しそう。
  • この桁を増やしていく作業の極限で万能の指数が作れる。
    これが万能の指数の底 \displaystyle e=\lim_{N\to\infty}\left(1+\frac1N\right)^N の由来。(Jakob Bernoulliのアイディア)
    桁を一つ増やす操作で1にどんどん近づくから、指数の底は正の数。
  • これに対してx\in\mathbb{R}に対し\displaystyle e=\lim_{x\to\infty}\left(1+\frac1x\right)^x=\lim_{x\to0}\left(1+x\right)^{1/x}は実数の指数を前提とした式で、ただの天下りで、値を求めるアルゴリズムが無い。
  • n乗根の「値(近似値列)」の導入で、 n乗根という実数を前提とする量のうさん臭さや、 eの定義にたどり着く教科書があってもいいのではないか?
  • 指数関数はe^xしかない。一般の底の指数関数はa^x:=e^{x\ln a}で定義される。
  • 底の値e=2.7...のときだけ指数法則を使わずに級数\displaystyle e^x=1+x+\frac{x^2}{2!}+\cdots+\frac{x^n}{n!}+\cdotsで指数関数の値を求めることができる。
  • このあたりの「値を求めるアルゴリズムの存在」が高校までの教程で不足しているのではないかと感じている部分。
  • 分母の有理化(例えば\frac{1}{\sqrt2}=\frac{\sqrt2}{2})の必要性は、むかしむかし関数電卓普及以前の有効数字がせいぜい4桁程度の時代に、量の値を筆算で求めなくてはいけない場合に、「2という正確な値でわり算を実行」と「1.414という近似値で面倒なわり算の実行」の対比の中で合理的な算法であったといえるが、スプレッドシートで10桁くらいは強引に計算できる時代に意味があるだろうか?
  • 数学IIIまで習った後ならば、f(xy)=f(x)+f(y)を出発点として対数関数(とその逆関数としての指数関数)を論理的かつ関数の値を求めるアルゴリズム(の方向性)付きで導出できる:e関連の極限の式を避けて対数関数と指数関数を微分する - あらきけいすけのメモ帳
  • 0.999999...は 「止まらないアルゴリズムで定義されている位取り記法された数」であり、 標準的な「量」の演算の体系では、その「量の値」は1に等しい。

京大の出題ミスのプレスリリース資料への根本的な疑問

まずはじめに京大の説明に抗議したい。説明資料*1に曰く:

従って、耳の動作原理を理解している解答者が、「音波の強弱は圧力変化の大小を意味している」と考えることは自然である。ただし…

とあるが、なぜ

だから天下の秀才を集めるる京大としては、これを理解しているレベルの学生を取ります。だからこの点では出題ミスにはあたりません

という論理ではないのか?

以下の計算をした結果、持った感想はこうだ:

「いえ、奴はとんでもないものを盗んでいきました」
「…?」
「物理学のココロです」

京大の出題ミスに対するリリース資料の中に「マイクロフォンには、変位 (速度) を検出するタイプのものも存在する」という記述がある*2。そしてこれが「出題ミス」の根拠となっている*3。これはよしだひろゆき氏の資料*4を下敷きにしたのではないかと考えられる。あらきは寡聞にしてそんなマイクロフォンの存在を知らない(検索してもなかなか見つからない)。そこで変位の大きさを具体的に求めてみて、どんな振動をするのか調べてみた。データの参照は可能な限りわざと Wikipedia を参照する。

まず「音の大きさ」を60dBとする。この大きさは環境庁の騒音基準*5において「相当数の住居と併せて商業、工業等の用に供される地域」の昼間の騒音の基準値である。目安としては「静かな乗用車, 普通の会話, 洗濯機(1m), 掃除機(1m)」*6とある。まずdBをPaに換算する。音圧の定義*7より、\displaystyle60{\rm{dB}}=20\log_{10}\frac{p}{p_0}である。ここで

p_0=20\times10^{-6}{\rm{Pa}}は人間の最小可聴値*8

である。これを解いてp=p_0\times10^{60/20}=20\times10^{-6}{\rm{Pa}}\times10^3=0.02{\rm{Pa}}となる。*9

次に0度C, 1気圧の乾いた空気の密度は1.293{\rm{kg/m^3}}*10, 音速は331.45{\rm{m/s}}*11であるから、変位の空間微分*12\displaystyle\frac{\partial\delta}{\partial x}\sim\frac{p}{\rho c^2}=\frac{0.02{\rm{Pa}}}{1.293{\rm{kg/m^3}}(331.45{\rm{m/s}})^2}=1.408\times10^{-7}となる。

ここで聞いている「音の高さ」を440Hzに設定する。この音はラジオの時報の音として誰もが知るピッチの音である*13。この音の波長は\displaystyle\lambda=\frac{c}{f}=\frac{331.45{\rm{m/s}}}{440{\rm{s^{-1}}}}=0.7534{\rm{m}}である。この値を用いて変位\deltaを概算すると\displaystyle\delta\sim\lambda\frac{\partial\delta}{\partial x}=0.7534{\rm{m}}\times(1.408\times10^{-7})=1.060\times10^{-7}{\rm{m}}となる。つまり

60dB, 440Hzの音の変位の大きさは0.1ミクロン程度(ちなみに大腸菌の短軸が0.4~0.7μmくらい*14*15

ということだ。

60dB程度の音響の場で100nmのオーダーの流体の振動を(もちろん流れを測るのだからマイクロフォンのカバー無しで流体中に直接に晒して)捉えられるダイアフラムを持ったマイクロフォンをご存知の方はあらきにご連絡を!*16

さらに計算を進める。変位\deltaを基にして速度の大きさ\displaystyle u=\frac{\partial\delta}{\partial x}を求めてみる。\displaystyle u=\frac{\partial\delta}{\partial t}\sim c\frac{\partial\delta}{\partial x}\sim\frac{p}{\rho c}=\frac{0.02{\rm{Pa}}}{1.293{\rm{kg/m^3}}\times331.45{\rm{m/s}}}=4.666\times10^{-5}{\rm{m/s}}となる。この値を基に、(熱力学的な圧力ではなく)空気の変位に基づく力(全圧=ゲージ圧+動圧の動圧の部分)大きさのオーダーを評価してみる。

\begin{array}{l}\displaystyle\rho u^2\sim\frac{p^2}{\rho c^2}=\frac{(0.02{\rm{Pa}})^2}{1.293{\rm{kg/m^3}}\times(331.45{\rm{m/s}})^2}\\=2.815\times10^{-9}{\rm{Pa}}\sim10^{-4}p_0\end{array}

この値を安直に解釈すると

60dB程度の音による変位の振幅に基づいた「音の大きさ」は、ヒトの可聴最小音の1万分の1くらい(およそ-40dBくらい)

となる。「定在波の変位の腹の音」が「聞こえる」とは到底思えない。なぜこんな屁理屈を「出題ミス」の要因として持ち出すのか?*17

高校物理の範囲ならむしろ「開管の共鳴」を持ち出すべきではないのか?「開管の共鳴」には次の特徴がある:

  1. 「入射波」「反射波」がある(だから定在波が立っている。しかも音の反射に「固い物質」は必ずしも要らない例になっている)
  2. 管に関して音源と反対側に音が伝わる(これは「壁の向こうに音が伝わる」問題設定と一貫している)

したがって問題の状況は「開管の共鳴」とのアナロジーを取れるから「圧力に関して固定端反射」という推論をやれるだけの材料が高校物理にあるし、京大が欲しい学生はこういう推論もできる(だから何の「固定端」かで迷う)人ではないだろうかとも思う。

私は音響は素人であり、先のエントリを見てもわかるようにおバカなので、みなさまの御叱正を賜りたい。

*1:http://www.kyoto-u.ac.jp/ja/admissions/events_news/office/kyoiku-suishin-gakusei-shien/nyushi-kikaku/news/2017/documents/180201_2/04.pdf

*2:京大, ibid.

*3:ちなみに「開管の共鳴」を高校で教えていることをすっかり忘れて、卵と壁?あるいは京大の音波の問題を解いてみた - あらきけいすけのメモ帳というお間抜けなエントリを書いたあらきは、現在、「京大の問題は、壁の反射条件が一意に決まらないので、出題ミスだった(だから京大の「ミスへの理屈」はダメだが、「対処」は正当である)」という意見に変わっている。反射条件の話はそのうちエントリを書きたい。

*4:https://www.dropbox.com/s/qf5ps8v23nccr96/resume.pdf?dl=0

*5:環境省_騒音に係る環境基準について

*6:騒音値の基準と目安 | 騒音調査・測定・解析のソーチョー

*7:音圧レベル - Wikipedia

*8:最小可聴値 - Wikipedia

*9:ちなみに大気圧はおよそ10^5{\rm{Pa}}なので音の圧力は約0.0000002気圧である。

*10:空気 - Wikipedia

*11:音速 - Wikipedia

*12:Sound pressure - Wikipedia

*13:A440 - Wikipedia

*14:大腸菌 - Wikipedia

*15:[2018.3.6追記]大気圧程度だと平均自由行程が68nm(平均自由行程 - Wikipedia)なので、音の変位の大きさは分子運動が「見える」サイズ、すなわち連続体(分子運動の平均値)としての流体の変位を測りたくても、個別の分子の運動の平均値と揺らぎが見えてしまい、瞬間の「変位」は確定できないのではないか?

*16:[2018.3.8追記]そもそも論として、流体の「変位」「速度」「加速度」を考えると、加速度は「流体のぶつかった相手(例えばダイヤフラムや圧電素子)」にかかった力(音圧)の反作用として測れる。速度は熱線流速計 microflown で測れる(丁寧で親切なコメントに感謝!)。変位は流体の位置を測らねばならないから、連続体としての流体の動きに追随する何か(追跡用の粒子など)を観測しないと測れないのでは?だから「100nm程度の変位を測るためのマイク」というものをなかなか想像できないのである。

*17:あらきは吉田氏には「マイクロフォンの実在」に関する挙証責任があり、それを未だ果たしてはいないと考えている。

京大が入試ミスを認めちゃったなあ

どういう理路で説明するんだろう?

そもそも論としては「点音源近似が破綻する音源近傍の振る舞いを問うてしまった」というところなのだが(いま「固定端反射」は問題になっていないと予想している)、何を「正解」とし、何をその根拠として説明するかを知りたい。先の僕のエントリは「点音源近似が音源近傍で破綻することに目をつぶって、速度ポテンシャル(あるいは圧力)の分布を用いた位相差当てゲームを音源まで拡張できれば解ける」という主張であった。

もし京大の理路が「音源の近傍で「変位」の「腹」があることも考えられる」というものであったら、その根拠となる実験事実が示されない限り、納得しないだろう。というのも、音波を「保存系」「圧縮性で渦無しの流体」「音波は線形近似」で考え、ベルヌーイの定理の保存量\rho\phi_t+p+\rho u^2/2の各項を評価すると*1、線形近似という前提条件から\rho\phi_t\sim p\gg\rho u^2となって、速度の振幅uのピークを圧力pのノイズの影響を受けずに(理屈の上ではp=0の「節」ではあるが)計測するのは無理じゃないかと思うのだ。つまり理屈の上では変位の振幅はピークを持つかもしれないが、少なくとも「教室でもできそうな実験」の範囲でこの「変位の振幅最大に伴う音」を検出するのは無理ではないかと思うのだ。

会見の詳報を待ちたい。

*1:[2018.2.3]速度ポテンシャルの項の質量密度\rhoの見落としを修正。kamokaneyoshiさま、ご指摘ありがとうございます。

卵と壁?あるいは京大の音波の問題を解いてみた

[2019.1.19追記]このエントリは、点音源近似が音源近傍で破綻することに目をつぶり、えいやっと変位は固定端、圧力は自由端反射モデル(閉管の共鳴の境界条件)で反射を求め、速度ポテンシャル(あるいは圧力)の分布を用いた〈位相差当てゲーム〉を音源に適用すれば、高校の物理で学習する処理の範囲内で解けるという方針で解いている■ この京大の出題には2個の問題点がある。一つ目は高校物理のおやくそくである点音源近似(同心円状の波面を想定して、[振幅の減衰を気にせずに]波の位相だけを当てること)が現実には破綻している点(同心円の中心点、すなわち音の発生源)での状態を問うていること。二つ目は高校物理で学習する範囲内では音波の反射について「閉管での反射」「開管での反射(←このエントリを書いたときはすっかり忘れてた)」しかモデルが無いのに、音波の透過と反射の双方を問うているので、壁での境界条件として高校物理の範囲内のどちらのモデルを想定して計算すればいいのか(実際問題としては壁での透過と反射が共存するとそのどちらでもないのだが)、問題文からは不明瞭であることである■ とは言うものの、高校物理は(本来は現象の核心を理解するための)「近似」「モデル化」のオンパレードなので、どこまでが出題として許容されるのかの判断が難しいと思う■

今度は京大か?新聞の論調はまるで「卵と壁」(村上春樹)みたいだ。でも本当にそうか?

計算をしてみた結論として「言いがかりに近いのではないか?」という感想を持った。阪大の『解答』問題設定は露骨にヘマだったが、京大の問題は受験の問題として良問ではないかと思う。Twitterなどでの議論で最悪の点は、議論で使う語を「高校物理」の範囲に無理やり押し込めようとして、式で書いたら明快な部分を不明瞭にしてしまっていることだ。まずはきっちりと解いて、それから「高校の知識に落とし込めるか?」を考える方が良い(この点で件のSEG/河合塾の先生の議論はイマイチで大学の大先生たちを説得できないと思う)。

まずは大学の学部程度で学習する水準の知識で力任せに壁での入射波、反射波を解く

流体の基礎方程式である連続の式とオイラー方程式を念頭に置きながら解く。まず速度は回転成分を持たないから速度ポテンシャル\phi(x,y,t)を用いて\boldsymbol{u}=\nabla\phiと書くことができる。このときオイラー方程式は\frac{\partial}{\partial t}\nabla\phi=-\frac{1}{\rho_0}\nabla pとなるので、速度ポテンシャル(のt偏導関数)と圧力が「逆向きのでこぼこを持つ関数」、つまり等高線を描くと同じ形になる関数とわかる。このことは後で波の干渉を議論するときに使う。

ここで高校物理で「ドップラー効果」をお勉強するときに、「音源を出てから聞き取るまでに波が走る行路の長さ」を測る計算のお約束として、点音源から同心円状に広がる波面を考える。(L,0)の位置にあるずーーーっとなり続けている音源(source)から軸対称に放射される音波の速度ポテンシャルは

\phi_s(x,y,t)=F(\sqrt{(x-L)^2+y^2})\sin[2\pi f(t-\frac{\sqrt{(x-L)^2+y^2}}{c})]

で与えらえる*1。ここで振幅Fは音源からの距離の関数であり、音源から遠いほど波面が広がっていくから、振幅Fは小さくなってゆくはずである(…が、ここではFの関数形を求めない)。

さて、壁での反射波(refrection)の速度ポテンシャルは(波面の形を描くと分かるのだが)ちょうど(-L,0)に音源があるものとして出てくる波の関数形である

\phi_r(x,y,t)=F(\sqrt{(x+L)^2+y^2})\sin[2\pi f(t-\frac{\sqrt{(x+L)^2+y^2}}{c})+\psi]

で与えられる(当然のことながら、音速と周波数は変わらない)。ここで\psiは反射で位相がずれるかもしれないので導入した定数で、「流体が壁を通り抜けて出入りしない」という条件から後で決める。速度のx成分は速度ポテンシャルのx方向の偏導関数なので

u_s(x,y,t)=\frac{\partial\phi_s}{\partial x}=\{F'(\sqrt{(x-L)^2+y^2})\sin[2\pi f(t-\frac{\sqrt{(x-L)^2+y^2}}{c})]\\-[2\pi\lambda F(\sqrt{(x-L)^2+y^2})]\cos[2\pi f(t-\frac{\sqrt{(x-L)^2+y^2}}{c})]\}\frac{x-L}{\sqrt{(x-L)^2+y^2}}

u_r(x,y,t)=\frac{\partial\phi_r}{\partial x}=\{F'(\sqrt{(x+L)^2+y^2})\sin[2\pi f(t-\frac{\sqrt{(x+L)^2+y^2}}{c})+\psi]\\-[2\pi\lambda F(\sqrt{(x+L)^2+y^2})]\cos[2\pi f(t-\frac{\sqrt{(x+L)^2+y^2}}{c})+\psi]\}\frac{x+L}{\sqrt{(x+L)^2+y^2}}

であるから、x=0での速度のx成分は

u_s(0,y,t)=\{F'(\sqrt{L^2+y^2})\sin[2\pi f(t-\frac{\sqrt{L^2+y^2}}{c})]\\-[2\pi\lambda F(\sqrt{L^2+y^2})]\cos[2\pi f(t-\frac{\sqrt{L^2+y^2}}{c})]\}\frac{-L}{\sqrt{L^2+y^2}}\\=-G\sin[2\pi f(t-\frac{r_0}{c})+\alpha]\frac{L}{r_0}

u_r(0,y,t)=\frac{\partial\phi_r}{\partial x}=\{F'(\sqrt{L^2+y^2})\sin[2\pi f(t-\frac{\sqrt{L^2+y^2}}{c})+\psi]\\-[2\pi\lambda F(\sqrt{L^2+y^2})]\cos[2\pi f(t-\frac{\sqrt{L^2+y^2}}{c})+\psi]\}\frac{L}{\sqrt{(x+L)^2+y^2}}\\=G\sin[2\pi f(t-\frac{r_0}{c})+\psi+\alpha]\frac{L}{r_0}

ここでr_0=\sqrt{L^2+y^2}, G=\sqrt{[F'(r_0)]^2+[2\pi\lambda F(r_0)]^2}, G\cos\alpha=F'(r_0)G\sin\alpha=-2\pi\lambda F(r_0) である。 

ここで 「流体は壁抜けをしない」すなわち速度の壁に垂直な成分u_xはゼロになるu_r(0,y,t)+u_s(0,y,t)=0という条件を課すと*2

Q\sin[2\pi f(t-\frac{r_0}{c})+\psi+\alpha]\frac{L}{r_0}-Q\sin[2\pi f(t-\frac{r_0}{c})+\alpha]\frac{L}{r_0}=0

よって\psi=2n\pi (nは整数)となる。これより反射波の速度ポテンシャルの関数形は

\phi_r(x,y,t)=F(\sqrt{(x+L)^2+y^2})\sin[2\pi f(t-\frac{\sqrt{(x+L)^2+y^2}}{c})]

となる(どうせグラフを描いたら同じ形になるから\psi=2n\piは消した)。この「速度ポテンシャルは剛体壁での反射で位相が変わらない」という式は「密度、圧力の場の時間変動部分は剛体壁の反射で位相が変わらない」という式でもある(これや高校物理のジャーゴンでは「自由端反射」という)。

これに対して速度のx成分は入射波と反射波の符号が壁で逆転する。ここが問題文中の「音波の反射条件は固定端反射とみなす」という表現に相当する。ついでに言うと速度のy成分は壁では符号は変わらない。

次に波の干渉について考えよう

波の干渉で次の図を見たことがあるだろう:

f:id:arakik10:20180122080522g:plain

図版出典:波の干渉 ■わかりやすい高校物理の部屋■(2018年1月22日アクセス)

http://wakariyasui.sakura.ne.jp/p/wave/housoku/kannsyou.html

ここで同心円は「何」を表しているのだろうか?音波の問題の場合は「速度ポテンシャル」「圧力(∝密度)」の等高線を表している。京大入試の物理の問題の場合は、壁での反射なので、図は次のようになる(図は上図を改変したもの):

f:id:arakik10:20180122081139p:plain

壁があるので、壁での反射波との干渉になる。先の計算の結果を考えると、反射波のポテンシャル(や圧力)は丁度、壁の反対側に同位相の音源があるものと見なした波になっている。つまり「壁が無いと思って2個の音源の干渉を求める」問題と等価になる(図は上図を改変したもの):

f:id:arakik10:20180122081403p:plain

では車をy方向に動かして干渉の様子を見よう

時刻t=0に位置(-L,0)にあった音源から出た音を、時刻t=Tに位置(L,-UT)で聞くと、音の速度ポテンシャルの値は

\phi_r(L,-UT,T)=F(\sqrt{(2L)^2+(UT)^2})\sin[2\pi f(T-\frac{\sqrt{(2L)^2+(UT)^2}}{c})]

時刻t=Tに位置(L,-UT)で車が出すの音の速度ポテンシャルの値は

\phi_s(L,-UT,T)=F(0)\sin(2\pi fT)

これより2個の速度ポテンシャルが逆位相となる条件は2\pi f\frac{\sqrt{(2L)^2+(UT)^2}}{c}=(2 n+1)\pinは整数)となる。ここで大事な条件がもう一つあって、距離\sqrt{(2L)^2+(UT)^2}は音が時間Tをかけて、えっちらおっちらやってきた距離なので\sqrt{(2L)^2+(UT)^2}=cTでもある。だからT=\frac{2L}{\sqrt{c^2-U^2}}の条件がつく。逆位相の条件は2\pi fT=(2 n+1)\piでもあるから、T=\frac{2n+1}{2f}である。ゆえに\frac{2n+1}{2f}=\frac{2L}{\sqrt{c^2-U^2}}すなわち\displaystyle L=(n+\frac{1}{2})\frac{\sqrt{c^2-U^2}}{2f}となる。ちゃんと解ける。出題ミスはない(阪大みたいな採点ミスはあるかどうか分からない)。

f:id:arakik10:20180123090501p:plain

注:この図版は1月23日に作製し、追加

固定端反射?

以上の計算では現象を記述する物理量として速度(とそのポテンシャル)と圧力と密度を用いた。音波は一つの物理量では記述できない自然現象である(ただし一つの物理量の方程式に落とし込んで解を求めるのは常套手段のひとつである)。速度の壁方向の成分は固定端反射(高校物理語)だが、圧力や速度ポテンシャルは自由端反射(高校物理語)である。しかも波が境界に対して斜めにぶつかっている。位相の条件を求めるには「(速度あるいは「変位」が)固定端反射」という表現は「ウソではないが正答を導くには厳しすぎる」気がする。

[1.23追記]しかし、逆に出題者の立場に立って考えてみよう。解答者は指導要領に縛られないが、出題者は指導要領に縛られる。指導要領の範囲内で音波の反射の条件を表現しようとすると、典型的な例題としては「気柱の共鳴」が考えられるが、これと類似の状況を記載するとすれば「音波の反射条件は固定端反射とみなす」以外の書きようがないのではないか。ここにいちゃもんをつけているとすれば「揚げ足取り」も甚だしい。[1.23追記終わり]

[1.24追記]では受験生の側では、この問題にどのような対策があるだろうか。(高校教師、予備校教師とは言っていない。彼ら彼女らは大学で科学の学び方を学んでいるはずである。大学以上の知識を動員して理解を進め、高校生のための知識に落とし込む努力をすべきである。)まず「点音源」だが、左右対称(1次元)軸対称(2次元)(球対称(3次元))なモードが出ていると前提して計算をする場合には

「変位」で考えた場合、音源の位置で振幅が逆になる

ことを理解しておくべきである*3

f:id:arakik10:20180115060712p:plain

f:id:arakik10:20180124080052p:plain

次に、壁による「音波の固定端反射」のときには、

壁に対して音源と対称な位置に同位相で振動する仮想的な音源がある

として、波の位相を計算するとよい。なぜなら壁の位置で「元の音源から左に走る波の変位」と「仮想音源から右に走る波の変位」が必ずちょうど壁の位置で振幅が常に逆になり、重ねると変位がゼロになるからである:

f:id:arakik10:20180124080258p:plain

この二つの物理的に高校の物理の範囲で教えることのできそうな知識を備えていれば、京大の問題は壁の向こうに仮想的点音源からの波の問題として取り扱うことができる。[1.24追記終わり]

点音源と波の速度の向き

波の干渉を教えるときに、点状の振動源を2個ならべて、直進する波の行路差から位相がかみ合う場所を求めるのはお約束のメソッドである。このときに波の進む向きを気にしたことがあるだろうか?

f:id:arakik10:20180122112710p:plain

位相が揃うかπずれるかしか見ていない。そもそも音波の干渉で「変位」という向きを持った量(ベクトル場)で議論するのは筋が悪すぎで、スカラー量である圧力、密度、速度ポテンシャルを使う方が良い。でもこれを高校物理に落とし込むのは結構、きついかなあ。まあそんなことゆうと「固定端反射」も「天下り式」だしいwwwww

よしだひろゆき氏のPDFに「なお、直接波と反射波が運転手の位置で斜めに交差する場合は、高校物理の範囲では議論できない」と書いてあったのを見て、ボクは目が点になってしまった。この人、波の干渉で何を教えてるんだ?

*1:計算に用いる技法はなるべく高校数学に近い部分で済ませたいので、\sinを使い、初期位相を固定した。

*2:この境界での条件を「変位」「圧力」で考えると、余計な考察が必要になって議論が面倒になる。速度を使い「壁抜けしない」が一番、計算も論理もすっきりする。

*3:阪大の問題の「Aモード」は4重極放射(多分Y_2^2(\theta,\phi))なので同様に逆になる、「Bモード」は双極放射(多分Y_1^1(\theta,\phi))なので向きが揃う。

壁に耳なし芳一、あるいは阪大の出題ミスを高校で習う範囲の数式できちんと説明する試み

例の入試ミス関連で、いくつかのブログやツイッターやPDFを見たけれど、高校数学の範囲内の数式を使って計算をきっちりと書いたものに出会えなかったので書いた。くだんのSEGの先生のメール*1やPDF*2を見たが、いかにも「受験物理のお行儀の良い答案」みたいな記述で、これでは天下の阪大の大先生たちを説得できはしないだろうと思う。たぶん「12月により詳細な指摘」(朝日新聞,1月6日)で数式を使った議論が出て、ようやくねじ伏せられたのだろう。理系の研究者は日頃から「論文の査読」というシステムでバトルしているので、そうそう簡単に説き伏せることはできないものである。

鉄1kgと綿1kg重いのは…

阪大の出題ミスで「阪大の言い訳」を朝日新聞で読んだとき、こんなクイズを思い出した「鉄1kgと綿1kg、重いのはどっち?」。こいつに「どちらも同じ」と答えたときに、「大気から受ける浮力の分だけ綿の方が軽い(kgって質量の単位だよね)」と返されたような気分になった。*3どこまでを「前提」としてるんだ?朝日新聞の図を引用しよう。

f:id:arakik10:20180114142242j:plain

この「音叉の問題」の全体を見ると、しょっぱなの問題がこれである

f:id:arakik10:20180114143958j:plain

きっちりとAモードの振動で疎密波の方向分布を問うている。ここから始めておいて、最後の問題だけ「Bモードもあるよ」ってのはちゃぶ台返しである。*4

f:id:arakik10:20180115041545p:plain

Google検索の結果(2018年1月15日アクセス)

愚痴、あるいはなぜ阪大ははまったのか?

出題者の学部学科なんて絶対に表に出ない。でも、これだけは言えるが、実は日本の大学の「理学部・物理学科」で流体力学を研究してる先生はほとんどいないのだ。いまの「物理学科」は量子力学が大好きで、流体力学を本格的に学びたいならば「宇宙物理学」「地球物理学」「機械工学」「航空工学」「核融合」といった学科、分野に進む方がいい(それとも東大理、京大理をめざす?)。今回も流体力学に慣れていないのでドツボにはまったのでは、と邪推している(てゆーか、受験物理で音波の反射は鬼門だという意見もツイッターとかで見た)。

波ってどのように式で表すのだろう?

まずは次のグラフを見て、これが「右に進む波」なのか「左に進む波」なのか分かるだろうか?

f:id:arakik10:20180114133912j:plain

正解は「わからない」である。波の山や谷が次の瞬間にどちらに動くかという情報が無いので何とも言えない。ではどちらに動くかということを数式ではどのように表すのだろう?答えは音源の位置をx=0として次のようになる:

 右(x>0の方向)に進む波:\sin\left[2\pi f\left(t-\frac{x}{c}\right)\right],

 左(x<0の方向)に進む波:\sin\left[2\pi f\left(t+\frac{x}{c}\right)\right]

ここでfは音源の周波数、cは音速。この式の意味は、波の山がxの位置にあったとすると、音源がその山を作ったのは|x|/c秒前だということ。波を表す関数は時刻と位置の関数だから「2変数関数」という高校数学の範囲外の関数が現れる。でも、どちらも三角関数の引数の中にお行儀良くあらわれているので、慣れれば大したことないと思う。

波の伝搬と反射の設定と計算

 まず音叉から出る右(正方向)と左(負方向)に進む音波をA-1(問1)の状況をきっちりと考慮に入れ、

f:id:arakik10:20180115060712p:plain

密度の分布が音叉に対して左右対称になるように、速度を次式で与える(振幅を1と置き、減衰はしないとした)*5

 u_{右}(x,t)=\sin\left[2\pi f\left(t-\frac{x}{c}\right)\right] (ただしx>0),

 u_{左}(x,t)=-\sin\left[2\pi f\left(t+\frac{x}{c}\right)\right] (ただしx<0),

ここでfは音源の周波数、cは音速。ここで音が反射する壁での状況を考える。壁(x=-d)での「壁への入射波」u_{左}

 u_{左}(-d,t)=-\sin\left[2\pi f\left(t-\frac{d}{c}\right)\right]

となる。ここで「壁からの反射波(右に進む波)」u_{反}

 u_{反}(x,t)=\sin\left[2\pi f\left(t-\frac{x}{c}\right)+A\right]

と置く(音速、周波数は反射で変わらないことを使った)。反射波の振動は山と谷がどこに来るかわからないので、位相にAを入れておく。ここで未知数Aは、壁(x=-d)での条件である「空気は壁を突き抜けて進むことはない」ことより

 u_{左}(-d,t)+u_{反}(-d,t)=0

が常に成り立つこととなるから*6

 2\cos\left(2\pi ft+\frac{A}{2}\right)\sin\left(2\pi f\frac{d}{c}+\frac{A}{2}\right)=0

 \Longrightarrow 2\pi f\frac{d}{c}+\frac{A}{2}=n\pi,

ここでnは整数。これより反射波を表す関数は

 u_{反}(x,t)=\sin\left[2\pi f\left(t-\frac{x}{c}-\frac{2d}{c}\right)+2n\pi\right]

となる。この反射波が音叉から右方向に出る音波と共鳴する条件は次のようになる:

 u_{右}(x,t)=u_{反}(x,t) (ただしx>0),

 \Longrightarrow \sin\left[2\pi f\left(t-\frac{x}{c}\right)\right]=\sin\left[2\pi f\left(t-\frac{x}{c}-\frac{2d}{c}\right)+2n\pi\right],

 \Longrightarrow -2\pi f\frac{2d}{c}+2n\pi=2k\pi,

ここでkは整数。 ここで波長\lambda\lambda=c/fで与えられることを考慮すると、求める条件は

 2d=m\lambda (ここでm=n-kは整数)

となる。

SEGの参考書は書店で拝見したことがあるが、SEGで学ぶ国公立理系上位校ねらいの生徒たちなら、これくらいの数式くらい簡単にフォローできるだろう。

入試出題採点経験者として言うが、出題者は学習指導要領に縛られるが、解答者は縛られる必要は全くないのである。

*1:https://www.dropbox.com/s/2vlzte1toqrgsf2/大阪大.pdf?dl=0

*2:https://www.dropbox.com/s/z5x1pq7k7i8daoy/osaka_u.pdf?dl=0

*3:こうゆうのをネットスラングで「小並感」というwwwww

*4:気づくのが遅すぎて、採点のやり直しもへったくれもない状況だったので、強弁せざるをえなかったんだろう。また、問5の設定から、問4の解答を逆算することもできるので、入試問題としてはいまいちかもしれない。

*5:出題者は左右の速度の設定でこけたのか?

それともう一つ。ここでの音叉から出る音は4重極放射なので、波の振幅が変わらないとした仮定はかなり非現実的かもしれない。

*6:これは学習指導要領の高校物理の範囲内では「固定端反射」に相当する。ちなみにここで壁は音が当たっても振動しないことになっているので、壁の向こう側に音は伝わらない。だからこの実験をレオパレスでやることはお勧めできない…ような気がする。

C言語の atan2(y,x) を arccos と sgn を使って書いてみた

授業用の覚書:関数電卓もそうだが、座標(a,b)偏角を求めるときに、\theta(b,a)=\arctan\frac{b}{a}では第3象限-\pi\lt\theta\leq-\frac\pi2, 第4象限\frac\pi2\leq\theta\leq\piの値を返さないので、C言語atan2(y,x) と同じ動作の関数を標準的な数学関数arccos, sgnの組み合わせで作ってみた。定義域は(a,b)\in\mathbb{R}^2\backslash\{(0,0)\}.

\displaystyle\theta(b,a):= \underbrace{{\rm{sgn}}(b)}_{(-\pi,0)に拡張}\overbrace{\arccos\frac{a}{\sqrt{a^2+b^2}}}^{[0,\pi]に値を持つ}+\overbrace{R(b,a)}^{0,\pi を担う}

\displaystyle R(b,a):=\frac{\pi}{2}(1-{\rm{sgn}}(a))\underbrace{|{\rm{sgn}}(a)|(1-|{\rm{sgn}}(b)|)}_{a\ne0,\ b=0\ を取り出す係数}

なぜ初等関数にないのだろう?

 

2023.7.4 desmosを使って実装してみた

www.desmos.com