読者です 読者をやめる 読者になる 読者になる

毎年定額を積み立てて、利率bで複利運用したとき、n年後の平均利回りは? 完結編

Excelで検算もできて、本当に求めたい値を出す式も出来上がったので完結編。
前回のエントリは利息ゼロの分が初項として加えられてしまう問題があったので、それを差っ引くように式を修正。最終的にはこうなった。

毎年定額を積み立てて、利率bで複利運用したとき、n年後の平均利回りは?

\frac{(\frac{(b+1)^(n+1)-1}{b})-(b+1)}{n}

うーん、なんかtex記法だと逆に式が読みにくいような… Excelの式ではこうなる。

((((1+b)^(n+1)-1)/(b))-(b+1))/n

bは利率なので実数で表すと1%が0.01とかになる。nは普通に積み立てる期間でOK。10年なら10。で、10年目に積み立てたらそこからもう1年運用すると、どうなるか?が上の式に値をぶっこむと答えが出てくる。答えは5.67%。

うーん、こうやって振り返ると設問がちょっと曖昧だったんだな。積み立てる期間が運用期間と一致していない。これが一致していたら前回のエントリでよかったわけだ。

昨日の式を整理してみる。

えーと、昨日の問題は…

毎年定額を積み立てて、利率bで複利運用したとき、n年後の平均利回りは?

\frac{((1+b)^1-1)+((1+b)^2-1)...((1+b)^n-1)}{n}

こうだった。
で、この式が冗長な感じがするので整理。足し算してる((1+b)^n-1)の最後の-1が結局展開するとnじゃんよという話が一つ。
もう一つはいちいち(1+b)とかうざすぎるので(1+b)=Bとか定義して式を整理してみる。

\frac{B^1+B^2...B^n}{n}-1
だーいぶ整理できた。要はこのB^1+B^2...B^nSnを求める公式があれば全てがバラ色に解決するということに!

私の白馬の騎士は一体どこに…

…ちょっと調べたら、こんなのがでてきた。
mathtrain.jp
ベルヌーイ数とか! もう無理なんですけど!!!!!
どうもこれ累乗の和とかいうらしい。もっとイージーな感じにならないものか…


ん、あれ? これもしかして初項1公比Bの等比数列の和???? Excelで検算してみるか。
とりあえずカンペ。
http://www.osaka-c.ed.jp/shijonawate/pdf/yuumeimondai/suuretu_17.pdf
Sn=\frac{a(r^n-1)}{r-1}


Excelで検算した結果、だいたい思っていた事が計算出来たことがわかった。げーっと!

高校数学がわからない…

老後資金の心配に端を発して、簡単に複利の利息計算ができる方法をいろいろと考えているんだけども、高校レベルの数学がわからなくてなくて困りモード。まあ、Excelで少し計算式いれれば解決するっちゃするんだけど、一発で一般項を求める式を書きたいじゃないですか。いまどきだとwolframalphaとかで計算できるわけだし…

で、計算したいのはこれ。

毎年定額を積み立てて、利率bで複利運用したとき、n年後の平均利回りは?

\frac{((1+b)^1-1)+((1+b)^2-1)...((1+b)^n-1)}{n}

数列の和で表現できて、たぶん公式で一発とは思うけど、基礎学力の無さが仇となってネット検索で解決できないという体たらく。情けない!

これが簡単に求まれば、出てきた平均利回りに積立総額掛けておしまいなのになー。ちくしょう! というわけで高校生のみんな! 数学ができないとこうやって年を取ってから苦労するんだ。今のうちに勉強しとけー!!!

新しいn個のファイルを残して、それ以外を消すというありがちな処理

パフォーマンスカウンタのログファイル。常時とるようにして何かあったら調べられるようにしたんだけど、そうなると問題になるのは垂れ流しにされるログファイルの後始末。ディスクのサイズが大きくなったとはいえ、放置というのもどうなの? ということで直近のn個を残して他を削除するナイスな方法はないものか?と思った次第。

結局使ったのはバッチスクリプト。こんなのになった。

@ECHO OFF
SET KEEPFILES=%3
SET TARGETDIR=%1
SET TARGETFILES=%2
IF "%KEEPFILES%"=="" SET KEEPFILES=3
SET COUNTER=0
FOR /F %%I IN ('DIR %TARGETDIR%%TARGETFILES% /O-D /A-D /B') DO CALL :DELFILES %TARGETDIR%%%I
EXIT /B

:DELFILES
SET /A COUNTER+=1
IF %COUNTER% LEQ %KEEPFILES% ECHO %COUNTER% KEEP %1
IF NOT %COUNTER% LEQ %KEEPFILES% ECHO %COUNTER% DELETE %1
EXIT /B

第一引数に対象のディレクトリ名。お尻は\で閉じてほしい。
第二引数は対象となるファイルをワイルドカードで指定したもの。
第三引数はいくつ保持するか。
いきなりファイル削除して泣いちゃったら困るのでこのスクリプトはECHOで対象になったかどうかだけを表示している。安全装置は自己責任で外すこと! おじさんとの約束だ!


で、これで動いておしまい。以下余談。というかおもしろかった所。

このスクリプト、カウンタをインクリメントしながら削除対象かどうかを判定している部分をわざわざサブルーチンにしている。DOの中にカッコでブロック切ってそこにかけばいいのに。具体的にはこんな風に。

FOR /F %%I IN ('DIR %TARGETDIR%%TARGETFILES% /O-D /A-D /B') DO (
  SET /A COUNTER+=1
  IF %COUNTER% LEQ %KEEPFILES% ECHO %COUNTER% KEEP %TARGETDIR%%%I
  IF NOT %COUNTER% LEQ %KEEPFILES% ECHO %COUNTER% %TARGETDIR%%%I
)
EXIT /B

これが意図したとおりには動かない。なんでか知らないけどCOUNTERの値がECHOで見るとゼロのまんま。なんでえええええぇぇぇええぇえぇえええええhfjfkじぇlkじぇflk;じぇkl??????? ってなりました。

これがバッチスクリプトの癖で変数を%%で括るとその時の変数の値で展開されて、そこから実際に実行されるんだけど、さて、このDOのブロック。%COUNTER%は一体いつ展開されるのかというと、SET /A COUNTER=+1を実行する前。この前の段階でゼロそのものに%COUNTER%と書かれている所が全部置換されてから実行される!

…まあ、そんなことはSET /?すると書いてあって、私もそれで解決したんだけどね。

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

この例では、現在のディレクトリのファイルの一覧は作成されず、代わりに最後
に見つけられたファイルが LIST 変数に設定されます。
これは %LIST% が FOR 文が読み取られるとき、
一度だけ展開され、そのときは LIST 変数が空だからです。
つまり、実際に実行されている FOR ループは

for %i in (*) do set LIST= %i

で、LIST に最後に見つけられたファイルを設定し続けているだけです。

で、Vオプションの話になるんだけど、私の場合これは使えない!と思ったので別の方法で回避。それがあのサブルーチンコールだったわけです。

ということで超ひさびさの日記でした。そしてゲーム用PCのHDDが壊れた。OSはSSDに入れてあって、HDD外したらふつうに起動したんだけど。さて、どうしてくれよう。

older NVidia video cards

なんか、steamのパッチが落ちてきたのでもしやと思ってCivilization beyond earthを起動したら動いたんですよ! 今までうごかねーうごかねーってずっと悩んでOSサラから入れなおしたりして。でもいままでまったくだめだった。で、どんなパッチか見てみたら。

We’re releasing a hotfix for Civilization: Beyond Earth that affects players using certain kinds of older NVidia video cards. Players experiencing stability issues since the release of the previous patch should see more reliable performance.

Steam Community :: Group Announcements :: Sid Meier's Civilization: Beyond Earth
(´・ω・`)

うちのグラボはというと。

これねー、¥28Kぐらいしたんだよ! 今時はどーなってんだ?

PassMark - GeForce GTX 260 - Price performance comparison
…似たような値段だと

価格.com - MSI R9 280 GAMING 3G [PCIExp 3GB] 価格比較
Radeon R9 280で、性能はざっくり五倍。
夏のボーナスでグラボを更新しよう。older video cardsなんて言わせないんだからねっ!