スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(物理)MathJaxとかいうのを試してみる

ブログでTexが直接打てるような時代が来たっぽいので僕も一つ試してみようかと。MathJaxって代物なんですが、ヘッダーに数行書き加えるだけで、あとは普通のtexの要領で書けばどのブラウザでもtexのかっこいいフォントが表示できるというとてつもなく便利なものです、

十字状のレール上を動く二つの質点について運動を考えてみたら面白かったので、出題してみたいと思います。

[問題]

下図のようにx軸とy軸上にそれぞれ質量がmの質点があり、これらの質点はそれぞれの軸上をなめらかに移動できる。例えば、x軸上の質点が原点でy軸上に移動するというようなことはできない。更に、これらの質点に質量が無視できて長さがLの剛体棒を滑らかにピン結合する。

最初、それぞれの質点は(x,y)=(L/√2,0)、(0,L/√2)に位置していた。t=0で、x軸上の質点に対して原点方向に大きさvの初速度を与えた。(これに応じてもう一方の質点と剛体棒にも初速度が発生する。)

[問1] このときの二つの質点の位置を時刻tの関数として表せ。
[問2] 剛体棒に働く軸力を時刻tの関数として表せ。

[解答は続きを読むをクリック]

zu.png
スポンサーサイト

続きを読む

Ruby…エ

今日は同窓会だったけど、レポート置き去りにしてたことに気づいてオワこんだった。
企画してくれたのに、すま~ん。




何の、レポートかというと、ハノイの塔のプログラム。
ハノイの塔って知ってます?知らないなら、ここでも見てくれい。
http://ja.wikipedia.org/wiki/ハノイの塔

大きさnのハノイの塔について、これを動かしていく様子が見れるような
プログラムをRubyで作ってくれいってのがレポートでした。

以下、プログラムの話なんで、つまんないです。



Wikipediaにも載ってるんだけど、コンピュータ的には再帰的な解き方が普通らしい。
まぁ、そこはいいんだけど、どうもプログラムを一から作るのがちょーだるかったので、
シケタイのものをそのままパクリ引用させてもらいました。

でまぁ、これが模範的なプログラムだと思われる。

def make1d(n) # Creates the sigle dimensional empty image.
image=Array.new(n)
for i in 0..n-1
image[i]=0
end
image
end

def make2d(w,h) # Creates the two dimensional empty image.
image=Array.new(h)
for i in 0..h-1
image[i]=make1d(w)
end
image
end


def first_hanoi(n) # Creates the image of the first stage.
img=make2d(6*n-3,n) # "n" stands for the size of the first hanoi.
for i in 1..n
for j in (n-i)..(n+i-2)
img[i-1][j]=1
end
end
img
end

def g(img,n,y) # Describes the hieght of the hanoi in the "y" row.
if img[0][(2*n-1)*y+n-1]==1
-1
else
g=n-1
while img[g][(2*n-1)*y+n-1]==1
g=g-1
end
g
end
end

def create(img,n,x,y) # Creates the "x" size disk in the "y" row.
g=g(img,n,y)
for i in ((2*n-1)*y+n-x)..((2*n-1)*y+n+x-2)
img[g][i]=1
end
end

def delete(img,n,x,y) # Deletes the "x" size disk in the "y" row.
g=g(img,n,y)+1
for i in ((2*n-1)*y+n-x)..((2*n-1)*y+n+x-2)
img[g][i]=0
end
end

def subhanoi(img,n,m,f,t,b) # Moves the m size hanoi tower from the f row to the t row.
if m==0 # "m" stands for the size of hanoi to move.
"done" # This value will be actually seen only in the end of the process.
else
subhanoi(img,n,m-1,f,b,t)
delete(img,n,m,f)
create(img,n,m,t)
show(img)
gets()
subhanoi(img,n,m-1,b,t,f)
end
end

def hanoi(n) # Shows the first image, and pressing Enter key, the second image and goes on to the further stages.
img=first_hanoi(n)
show(img)
gets()
subhanoi(img,n,n,0,2,1)
end



うん、さすがシケタイ。素人の僕の目から見ると、無駄がない気がする。
後半で、関数subhanoiってのが定義されているんだけど、これが本体で、
subhanoiの中に、subhanoiが入れ子になって入っているでしょ?
これが、再帰関数の特徴で、単純な試行になるまで、どんどん掘り下げていくってこと。





で、Wikipediaにもう一つの方法があって、これはもう答えを知ってることを前提としていて、
一番小さい円盤を動かして、次にその他の円盤を動かす、ってのを繰り返すっていう方法。

さすがに、パクリだけを提出するのが気が引けたので、素人の僕なりに頑張って、
こっちのアルゴリズムで作ってみました。

def make1d(n) # Creates the sigle dimensional empty image.
image=Array.new(n)
for i in 0..n-1
image[i]=0
end
image
end

def make2d(w,h) # Creates the two dimensional empty image.
image=Array.new(h)
for i in 0..h-1
image[i]=make1d(w)
end
image
end

def hanoi_first(n) # Creates the image of first stage.
a=make2d(6*n-3,n) # "n" stands for the size of the first hanoi.
for i in 1..n
for j in (n-i)..(n+i-2)
a[i-1][j]=1
end
end
a
end

def g(a,n,y) # Describes the hieght of the hanoi in the "y" row.
if a[0][(2*n-1)*y+n-1]==1
-1
else
g=n-1
while a[g][(2*n-1)*y+n-1]==1
g=g-1
end
g
end
end

def enban(a,n,x,y) # Creates the "x" size disk in the "y" row.
g=g(a,n,y)
for i in ((2*n-1)*y+n-x)..((2*n-1)*y+n+x-2)
a[g][i]=1
end
end

def zero(a,n,x,y) # Deletes the "x" size disk in the "y" row.
g=g(a,n,y)+1
for i in ((2*n-1)*y+n-x)..((2*n-1)*y+n+x-2)
a[g][i]=0
end
end

def hanoix(n)
a=hanoi_first(n)
show(a)
gets()
zero(a,n,1,0)
enban(a,n,1,n%2+1)
show(a)
gets()
while !biggest_top_one(a,n)
ss=second_size(a,n)
tor=the_other_row(a,n)
zero(a,n,ss,second_row(a,n))
enban(a,n,ss,tor)
show(a)
gets()
onr=one_row(a,n)
if n%2==0
if onr!=2
onrt=onr+1
else
onrt=0
end
else
if onr!=0
onrt=onr-1
else
onrt=2
end
end
zero(a,n,1,onr)
enban(a,n,1,onrt)
show(a)
gets()
end
end

def topsize(a,n,y)
g=g(a,n,y)+1
size=0
if g==n
0
else
for i in ((2*n-1)*y)..((2*n-1)*y+n-1)
size=size+a[g][i]
end
size
end
end

def biggest_top_one(a,n)
x=topsize(a,n,0)
y=topsize(a,n,1)
z=topsize(a,n,2)
if x+y+z==1
true
else
false
end
end

def one_row(a,n)
x=topsize(a,n,0)
y=topsize(a,n,1)
z=topsize(a,n,2)
if x==1
0
else
if y==1
1
else
2
end
end
end

def second_size(a,n)
x=topsize(a,n,0)
y=topsize(a,n,1)
z=topsize(a,n,2)
if x==0
if y==1
z
else
y
end
else
if y==0
if x==1
z
else
x
end
else
if z==0
if x==1
y
else
x
end
else
if x>y
if x>z
if y>z
y
else
z
end
else
x
end
else
if y>z
if x>z
x
else
z
end
else
y
end
end
end
end
end
end

def second_row(a,n)
x=topsize(a,n,0)
y=topsize(a,n,1)
z=topsize(a,n,2)
if x==second_size(a,n)
0
else
if y==second_size(a,n)
1
else
2
end
end
end

def the_other_row(a,n)
if 0!=one_row(a,n)&&0!=second_row(a,n)
0
else
if 1!=one_row(a,n)&&1!=second_row(a,n)
1
else
2
end
end
end



前半は、さっきのパクリと同じで、関数hanoix以下の関数が、自前で作ったやつです。
うーん、ゴミみたいに長いね。second_sizeとか何回if else使ってるのって感じだね。もっと、簡素にできるやろ。

まぁ、スリムにするのも頭使うけど、プログラミングって、どこか一つでも記述間違いがあったら、
ちゃんと動いてくれないから、これがすごく疲れた。何度もトライ&エラーを繰り返して、その度に
どの行が間違えているのか考えて修正していったわ・・・。

こんなのまだ雑魚レベルだろうけど、デバッグの大変さを思い知りました(笑)

明日から学校です。期末嫌だー(笑)

元に戻る?

クラスメートが面白い問題を出してきたので。


【問題】
ルービックキューブに、一回または複数回の回転を組み合わせた試行を与えるとする。
このとき、同じ試行を連続で有限回行えば、必ず元の色の配列に戻ることを示せ。

※注意
回転させるときは、回転させる行または列以外は固定したままとし、
同じ回転とは、回転させる行または列の位置が、ルービックキューブの色の配列に関係なく、
空間的に等しい場所であり、回転方向が同じであるものとする。



解答は、つづきで。

続きを読む

四角い銅板を回す。

【物理 問題】

下図のように、一辺2aの正方形の銅板があり、その重心を銅板に垂直に貫く
導電性の回転軸が貫いていて、回転軸と銅板の輪郭がブラシを介して接続されている。
銅板が回転しても、常にブラシが銅板の輪郭に接するようにバネ状になっているが、
そのインダクタンスは無視できる。回路全体の抵抗を、図のようにR(一定)として代表させる。
また、磁束密度Bの磁場が、銅板に垂直に流れている。

いま、銅板を角速度ωで回転させ始めた。
但し時刻0において、銅板に接したブラシは、
輪郭のある一辺の中点において接しているものとする。

sikakkei.png

(1)時刻0≦t≦π/(4ω)において、抵抗Rに流れる電流の大きさIを、tの関数として表わせ。
(2)時刻0≦t≦2π/ωにおける、t-Iグラフを図示せよ。
(3)この銅板が正方形ではなく、正N角形であった場合のt-Iグラフを、
N=3、N=6、N→∞、の3つの場合について、(2)のグラフと同様に示せ。
いずれの場合でも重心と一辺の距離がaであるとし、他の状況は前述した通りとする。

(解答は、以下の続きで)

続きを読む

自作問題2の解答

aajoukaitou.png
【間違いがあった場合は、ご指摘ください。】

二項間漸化式で、a[n+1]=P(a[n])なる関数P(x)が表現出来る場合は、
グラフy=P(x)とy=xを用いることで、視覚的に数列{a[n]}の動きが表現出来る。
本問の場合は、P(x)=a^(x/a)ということになる。
以下に、y=P(x)を赤曲線、y=xを緑直線で各aについての例を示す。

if2staircase.png
上がa=2の場合である。(ルート2のルート2のルート2乗乗…と続くもの。)
このように、1<a<eの場合は交点y=aに向かって、階段上にa[n]が増加して収束していく。

if0-50staircase.png
上がa=0.5の場合である。
このように、1/e<a<1の場合は、今度は螺旋状に回りながら収束していく。


さて、普通であれば、平均値の定理を関数P(x)に用いて、a[n]-aの大きさが小さくなることを示す。
P'(c[n])がの絶対値が1未満であることが示せれば解答のように用いることで、題意は直ぐに示せるはずである。
1<a<eでは、確かにこれを用いてごく簡潔に証明できる。(この場合、|a[n+1]-a|<(loga)|a[n]-a|と挟める。)
しかし、1/e<a<1の場合は何故か上手くいかない。

if0-37staircase.png
ここで、上のa=0.37を見ていただきたい。(0.37>1/e=0.367…)
この場合も無事収束することは分かるが、何か様子が違う。
詳しく見よう。
a[1]=1,a[2]≒0.1,a[3]≒0.8 …
ここで、a[n]とaとの距離、|a[n]-a|を考えると、
|a[1]-a|≒0.6,|a[2]-a|≒0.3,≒|a[3]-a|≒0.4 …
賢明な読者なら何が言いたいか分かるだろう。
1/e<a<1のときは、|a[n]-a|が単調減少しないようなaの範囲が存在する。
当然のことながら、P'(c[n])の絶対値がnによって1より大きかったりする。

たしかに、収束するんだけれども、aに一歩近づいて、一歩近づいて…という具合ではなく、
aに一歩近づいて、半歩遠ざかって、一歩近づいて…という具合になっている。
だから、これでは示せない。

ここで、n=奇数のときは近づいて、n=偶数のときは遠ざかって「そう」だが、(要証明)
nとn+1のときを纏めて考えれば近づきそうだな、という発想が浮かぶ。
(付け加えておくと、私はパソコンにこのグラフを描かせてやっと、これらのことに
気づいたわけで、紙と鉛筆しか持っていない人が気づいたとしたらすごいと思う。)

そこで、本解答ではP(x)を一度に二回使う合成関数f(x)=P(P(x))を用いたわけである。
このようにすれば、nが偶数の場合、nが奇数の場合を分けて考えることが出来る。
なお、1<a<eのときは前述のようにP(x)で事足りるが、分けて書くのも面倒だったので、
f(x)一つだけ使って、同時に示してみた。


さて、これで問題は解決したわけですが、
a=eとa=1/eの場合が個人的には気になります。

ifestaircase.png
上がa=eの場合。実は、y=P(x)とy=xはa=eのときに接する。
見た感じでは収束しそうな気がする。

if1dividedbyestaircase.png
上がa=1/eの場合。一見収束してなさそうだが、これはa[1]~a[1000]までの状況しか書いてないから。
nをもっと大きくしていけば、交点である1/eに近づきそうに思える。

ここで、なぜ安易に収束すると言わないのかというと、
f'(c[n])を1より小さい定数で挟むのが(私には)難しいからです。
f'(c[n])自体は確かに1より小さいようなのですが、f'(c[n])はnによる変数です。
これでは、0に収束することは言えません。

0より大きい変数を無限個足し合わせても、無限に発散しない場合があるのと同じです。
たとえば、1/k (k=1,2,3,…)は全て正です。これをkについて全て足し合わせると、
Σ1/k=∞ となり発散します。
しかし、1/k2(k=1,2,3,…)は全て正ですが、これをkについて全て足し合わせると、
Σ1/k2=π^2/6 となって収束します。発散しません。

つまり、f'(c[n])<1だけでは不十分で、
f'(c[n])≦K<1なる定数Kを見つけるか、
巧みな技を用いて、直接f'(c[n])をnについて掛け合わせた積が
0に収束することを言わないといけないわけです。

果たして収束するのか?
管理人は力量不足なので、この究極の状態は諦めます。
できたら、誰か教えてくれw (いや、教えてくれても分からないかもしれん。)



omosiroi.gif
最後に、y=x(緑),y=P(x)(赤),y=a(青)の場合について、aを0.1~5まで動かした様子を示す。
さきほど、1/e<a<eの場合は交点であるy=aに収束することを説明したが、
上を見て貰えれば分かるように、a>e(2.7…)以降、赤のグラフはだらりと下がっていく。
このとき、y=aでの交点は依然として存在するが、それよりもy座標の小さい交点が生まれる。
つまり、a>eのときは、aではなく、1以上e以下のある定数に収束してしまう。
ちなみに、0<a<1/eのときは、0と1の間で振動するようである。(要証明)


なお、そろそろ受験間近になってきたので、
問題作り・解説は自粛する。記事もより更新しなくなるだろう。
プロフィール

SHUN

Author:SHUN

アクセス数
最近の記事とコメント
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
Vocaloid Ranking Watcher
全記事表示リンク

全ての記事を表示する

Evangelion
検索フォーム
リンク
ブロとも申請フォーム

この人とブロともになる

個人的 神曲
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。