Unityと数学の学習帳

Unityと数学の同時学習を目的としたブログ

翻訳を支援するunity用プログラム

HatInTimeの翻訳を支援するunity用プログラム

正規表現を利用してテキストファイルの中身を解析し目的に沿った編集を行った上で非破壊的にデーターを出力するプログラムを組んでみた。
個人の目的に特化して作られたコードだが、正規表現を利用した親子構造を持つスクリプトの内容の置換は応用が効く為、よく似た目的を持つ人の参考資料になるかもしれない。
コードはunity上で実行されることを前提に書かれている。適当なgameObjectsにクラス名を合わせてAddComponentすれば、すぐに動くと思う。

HatInTimeの翻訳を支援するunity用のプログラム

やっていることの例:
以下のような二つのテキストファイルがあるとする。refは元の翻訳前のテキストファイル。workはrefに対して同名同フォルダ構成の翻訳作業後のテキストファイル。
f:id:cqbosinko:20180929141923p:plain

各セリフのデータはシーンを表すヘッダ「[シーン名]」と、そのシーン内でキャラクタが喋るセリフ「タグ=台詞」で構成されている。
workデータは翻訳作業や様々な理由により、refデータの行位置関係と比べバラバラな位置になってしまっている。
このプログラムはrefのデーターをベースにしてworkの各コードを抽出し位置を合わせて整理する。

結果、以下のようなテキストファイルをフォルダやファイルの位置関係も合せながら別途に出力する

f:id:cqbosinko:20180929143218p:plain

ゲーム側のスクリプト処理の特徴として

[groupA]
voice1 = code1
voice2 = code2

[groupB]
voice1 = code3
voice2 = code4

というスクリプトがあった場合、ゲーム側はgroupAにvoice1=code1とvoice2=code2を関連付けて処理する。
従ってgroupAにvoice2 = code4が関連付けられたり、groupBにvoice2 = code2が関連付けられるとデータとしては使えなくなる。
この「親子関係は維持」して変換する必要がある。

[親]
子1=code
子2=code

当プログラムは、これを正常に変換する。
変換後の翻訳作業にはVisualStudioの「比較モード」を利用して翻訳作業を進める。比較モードは実行ファイルよりオプションと対象ファイルを指定して実行する必要がある
例えば以下のようなバッチファイルを作り、あらかじめ一つVisualStusioを起動した状態でバッチファイルを起動するとすべての対象ファイルがタブに収められる

cd C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\
start devenv.exe /diff C:\Users\yourPC\Desktop\labo\ref\sequences\seals_ship.int D:\SteamLibrary\steamapps\common\HatinTime\HatinTimeGame\Mods\JapaneseMod\Localization\INT\sequences\seals_ship.int
start devenv.exe /diff C:\Users\yourPC\Desktop\labo\ref\sequences\alpv_ship.int D:\SteamLibrary\steamapps\common\HatinTime\HatinTimeGame\Mods\JapaneseMod\Localization\INT\sequences\alpv_ship.int
start devenv.exe /diff C:\Users\yourPC\Desktop\labo\ref\sequences\crows_ship.int D:\SteamLibrary\steamapps\common\HatinTime\HatinTimeGame\Mods\JapaneseMod\Localization\INT\sequences\crows_ship.int

画面はこのようになる
f:id:cqbosinko:20180930145319p:plain




A Hat in Time のMOD制作忘備録

「A Hat in Time」はアンリアルエンジン3を利用して作られていた。MODを作る際にUE3の知識が得られたので忘備録として残しておく
あくまでunityユーザーからのUE3機能把握を感覚的に忘備録として書いているので内容は”いいかげん”です。ふーん。そんなものかな?といった感じで読んで欲しいです。

  • UE3は基本的にマルチランゲージをサポートしている
  • ゲームフォルダ内のLocalizationフォルダ内のintフォルダが初期言語として設定される(大抵、英語)拡張子は各国別に3文字で指定できる。日本は*.jpn。メモ帳やヴィジュアルスタジオなどで開くと分かるが単なるテキストファイル。このファイル内で使われる文字コードにより自動的に利用するフォントをエンジンが決定している
  • KISMETは視覚的に確認できるプログラミングでActorと連携して機能させることが出来る。非常に癖が強い。Actorをドラッグ&ドロップすることでクラス機能を配置できる
  • ActorはunityにおけるGameObjectに相当するらしい。Actorに対して*.ucスクリプトファイルを利用してクラスを作成し、関数やプロパティを実装、処理する
  • UPKファイルはunityにおける圧縮され整頓されたAssetBundleのようなものに該当するらしい。画像、フォント、音楽などの素材データになる
  • 「A Hat in Time」ではMODフォルダ内に決まった形式でデーターが収まっている必要があった。好き勝手にデータファイルを置いてもうまく動かない
  • Classesフォルダ。MODそのものが利用し生成したクラスファイル。基本的にMOD_Managerアプリに生成を任せていればOK
  • Contentフォルダ。MODで利用するUPKファイルは全てここに収めて置く。コンパイラはこのフォルダの中身を見る
  • Localizationフォルダ。言語ファイルを収める。日本語コードでもintフォルダに*.intとして納めれば初期言語としてオーバーライドできる。これに関してはコンパイル不要
  • Mapsフォルダ。マップデーターを収める。マップデーター実行時はマップエディターでのBuildが必要。またMOD_ManagerアプリでCompile_ScriptsとCookedが必要
  • カレントにmodinfo.iniを作成し細かいMODの設定をスクリプトで行う。多くのファイルをリプレースする場合、このファイルを編集する機会は必然多くなる。内容は人が作ったものを参考にするとよい
  • 他人の作ったMODデーターはスチームがDドライブにインストールされている場合、D:\SteamLibrary\steamapps\workshop\content の各ゲームIDの中にワークショップ単位で収められている。これをゲームのMODフォルダ内に収めればソースが再現できる
  • UE3とUE4はファイル形式そのものが違い互換性はまったくない
  • 全てのデータが揃うと「Update Steam Workshop」でパブリッシングできる。steamワークショップでは常に履歴は記録されロールバック出来る。
  • パブリッシュされるとMODフォルダのカレントにSteamWorkshop.iniが生成される。テキストファイルで開くと中にWorkshopIdが記録されている
  • フォント作成ではUE4を利用した。UE3は日本語フォント未対応(確認済み。またフォントによってはプロテクトがあるものもあるようだ)。ファイルの互換性はまったくないのでUE4でTGA形式で出力し、フォントデーターの。各プロパティを手動で地道にコピペしていく事でUE4形式からUE3に移植した(コピペは内容を少し編集すると丸ごと移し替えることが出来た。一度メモ帳か何かにペーストしてUE3が飲み込める形に書き換える。要内容観察)
  • UE3ではエディタのContentBrowserの利用が非常に重要になってくる。ここではUE3エンジンが読み込んだ全素材データーを閲覧できる。ActorClassesでは*.ucで作成した動作するクラスを閲覧でき、クラス機能(関数やプロパティ)をkismetやマップエディタ内にドラッグアンドドロップで配置できる。この辺りはunityのGameobjectsと扱いが良く似ている(重要!)おそらくコーディングで新しくクラスを作るとコンパイルしないとクラスとしてエンジンは認識しないと思われる(unityのように作ったら即認識はしないと思われる。未確認)
  • エディタのlevelタブではマップ内に配置した素材を検索閲覧できる
  • ContentBrowserのImportを利用することで自分が作成した画像や音楽、などのデーターをインポートできる。PSDファイルなども読み込めるので便利
  • 読み込んでもセーブする必要があるので注意。この時のセーブされたファイルの配置などに注意。
  • 各素材は右クリックすることで様々な機能にアクセスできることに留意。copy full name to clipboardなどは非常に重要な機能で、modinfo.iniファイルなどでMODにリプレースを指示するときに重要になってくる
  • 日本語の翻訳作業は検索機能が強力なvisualStudioがおすすめ。フォルダ内検索などでは*.ucファイルなどのテキストワードなども一括検索できるのでイベント名を利用してactorのクラスを探すなどにも利用できた。コレが出来るとできないでは作業上、大きく能率が変わるので、他の作業でも積極的にvisualstudioを利用すること。とにかくコード編集のみならずテキスト編集で高度な作業はこれでやったほうがいい。一度読み込んだ複数ファイルはプロジェクトとして保存しておくと状態を維持するので作業の再開も非常にスムーズだった。複数ファイルを横断した置換なども可能(名詞の統一などにも威力がある)

総評;UE3は古い作りというかunityより二次生成物が多いので手間がかかりめんどくさい。UE4で改善されていると思われる。実行ファイルはunityより早くて快適だが作る手間は少し多いと感じた

指数と直感の話

先日、郵便物を読んでいて興味深い数学の話があったので自分なりに記事を再検証してみることにした。
記事の内容をそのまま、ここに載せるのはリテラシーの面で問題があるので多少、問題の形を変えて考えてみる。

資料:瀬山士郎先生の数学よもやま話:連載15 ちょっとおかしな賭け
こんな賭けがある。100枚のカードがあり各カードには「WIN(勝ち)」、「LOSE(負け)」と書かれている。この100枚のカード全てを裏にして並べて置き、任意のカードを表にして「WINが出たら」現在の所持金の半分がもらえる。「LOSEが出たら」現在の所持金の半分が奪われる。このゲームを100枚のカード全部、表にするまで行う。とする。「WIN(勝ち)」のカードが61枚、「LOSE(負け)」のカードが39枚だとする。あなたは、この賭けにのりますか?


直観的に考えると、お金の出入りは半額同士なのでカードの配分を考えると自分が圧倒的に有利だと思う。
しかし、この賭けは罠だ。このゲームにのったら最期、自分の最終所持金が必ずほぼ10%になってしまう。

計算してみよう。

連続で61回勝利し、その後、連続で39回負けるとする。最初の所持金は100円とすると、式はこうなる

{ a }_{ 1 }=100\quad ,\quad { a }_{ n+1 }={ a }_{ n }+\frac { { a }_{ n } }{ 2 } \quad \left( n=1,2,3,\cdots ,60,61 \right) \\ \Rightarrow \quad { a }_{ n+1 }={ a }_{ n }\cdot \left( 1+\frac { 1 }{ 2 }  \right) \quad \Rightarrow \quad { a }_{ n+1 }={ a }_{ n }\cdot \frac { 3 }{ 2 }

漸化式と一般解の公式 { a }_{ n+1 }={ a }_{ n }r\quad \Rightarrow \quad { a }_{ n }={ a }_{ 1 }{ r }^{ n-1 }を利用して漸化式を一般式に変換すると

{ a }_{ 1 }=100\quad ,\quad { a }_{ n+1 }={ a }_{ n }\cdot \frac { 3 }{ 2 } \quad \left( n=1,2,3,\cdots ,60,61 \right) \quad \Rightarrow \quad { a }_{ 61 }=100{ \cdot \left( \frac { 3 }{ 2 }  \right)  }^{ 61+1-1 }

これで61枚目を開いた状態の所持金の値になっているので、このまま続けて

b_{ 1 }={ a }_{ 61 }\quad ,\quad b_{ n+1 }=b_{ n }-\frac { b_{ n } }{ 2 } \quad \left( n=1,2,3,\cdots ,38,39 \right) \\ \Rightarrow \quad { b }_{ n+1 }=b_{ n }\cdot \left( 1-\frac { 1 }{ 2 }  \right) \quad \Rightarrow \quad b_{ n+1 }={ b }_{ n }\cdot \frac { 1 }{ 2 } \quad \Rightarrow \quad b_{ 39 }={ a }_{ 61 }{ \cdot \left( \frac { 1 }{ 2 }  \right)  }^{ 39+1-1 }

従って100枚すべてめくった時の所持金は

100{ \left( \frac { 3 }{ 2 }  \right)  }^{ 61 }{ \left( \frac { 1 }{ 2 }  \right)  }^{ 39 }

となる。

この計算は乗算で閉じている。つまり演算項の順番、言い換えると勝ち負けの順番が自由に入れ替わっても100枚全部表にする以上、計算結果は変わらない事に注目する必要がある。
つまりどんなことをしようが、必ずこうなる。

100{ \left( \frac { 3 }{ 2 }  \right)  }^{ 61 }{ \left( \frac { 1 }{ 2 }  \right)  }^{ 39 }=10.03221824771

100円あった所持金は必ず10円になる。こういうペテンがあるのだ。
試行中の所持金の値をスプレッドシートで確認できるようにした。値が信じられないなら以下を参照

docs.google.com

計算式は以下のようにpocketCasでも仕組みを検証できる

f:id:cqbosinko:20180830165345p:plain

この一連の問題は物事を指数に変換してみると分かりやすいと言う事を非常にシンプルに表している様な気がする、つまり...
\frac { 1 }{ 2 } ,\frac { 2 }{ 2 } ,\frac { 3 }{ 2 } この3つの数字を2の指数表示にしてみると{ 2 }^{ -1 },{ 2 }^{ 0 },{ 2 }^{ 0.5849625... }
となる。-1と0.5849625...では値的にどちらが強いか?という風に考える事も出来る。要約すると以下のように考えるとさらにシンプルになる

{ \left( \frac { 3 }{ 2 }  \right)  }^{ 61 }{ \left( \frac { 1 }{ 2 }  \right)  }^{ 39 }\quad \Rightarrow \quad { \left( { 2 }^{ 0.5849625... } \right)  }^{ 61 }{ \left( { 2 }^{ -1 } \right)  }^{ 39 }\quad \Rightarrow \quad \left( { 2 }^{ 0.5849625...\times 61 } \right) \left( { 2 }^{ -1\times 39 } \right) \quad \quad \Rightarrow \quad \left( { 2 }^{ 35.68271... } \right) \left( { 2 }^{ -39 } \right)

ここで2を底とした理由だが、これは直感的なもので、どう説明して良いのか実は私自身考えている最中のものである(メカニズムのにおいは感じているが言葉に変換できていない)
この右端の式は、勝敗のカードの枚数の配分が何枚なら、この賭けに乗ってもいいかの意味を単純に表している。
つまりWINのカードの枚数が、4乗分だけ、もう少し必要なのだ。

TODO

ネイピア数に関して

虚数の情緒P528~529の別解釈

ここではネイピア数の値を求めている。方法は幾つかあるが、よく似たやり方で接線の方程式を利用して求める方法を考えてみた

指数関数と、その導関数
f\left( x \right) ={ a }^{ x }\quad \mapsto \quad f'\left( x \right) ={ a }^{ x }\ln { a }

標準的な微分係数の式
f'\left( a \right) =\lim _{ b\rightarrow a }{ \frac { f\left( b \right) -f\left( a \right)  }{ b-a }  }

実際に利用する関数と導関数
f\left( x \right) ={ 10 }^{ x }\quad \mapsto \quad f'\left( x \right) =10^{ x }\ln { 10 } \quad

0に限りなく近い極小の差としてb,aを考える

b=\frac { 1 }{ 32768 } ,a=\frac { 1 }{ 65536 } ,\quad f'\left( 0 \right)

これを接線の方程式として代入

10^{ 0 }\log _{ e }{ 10 } \simeq \frac { { 10 }^{ \frac { 1 }{ 32768 }  }-{ 10 }^{ \frac { 1 }{ 65536 }  } }{ \frac { 1 }{ 32768 } -\frac { 1 }{ 65536 }  } =2.3027...

これの未知数eを求めている。その値と関係は以下になる

 \log _{ e }{ 10 }  =2.3027 ・・・①

{ e }^{ 2.3027 }=10\quad \Leftrightarrow \quad { e }^{ \frac { 2.3027 }{ 2.3027 }  }={ 10 }^{ \frac { 1 }{ 2.3027 }  }\quad \Leftrightarrow \quad e={ 10 }^{ \frac { 1 }{ 2.3027 }  }\quad \Leftrightarrow \quad e=2.7182...
f:id:cqbosinko:20180209220926p:plain

P529の詳細を考える

P529の以下の式を考えてみる

10^{ \frac { n }{ 65536 }  }\simeq 10^{ 0 }+\frac { 2.3026 }{ 65536 } \cdot n

この2.3026\ln { 10 } の事を指している。従って式は

10^{ \frac { n }{ 65536 }  }\simeq 1+\ln { 10 } \frac { n }{ 65536 } と書き表せる

ここでt=\frac { n }{ 65536 } とすると

10^{ t }\simeq 1+\ln { 10 } \cdot t となる

これは先に結論から書いてしまうと一次近似式の形に近い
例えば  t=\frac { 1 }{ 128 }  周辺から小さくなればなるほど精度が向上していく(P528参照)。以上を踏まえて微分の式から一次近似式を導出する式を以下に書いてみる

\displaystyle \lim _{ b\rightarrow a }{ \frac { f\left( b \right) -f\left( a \right)  }{ b-a }  } =f'\left( a \right) \quad \Leftrightarrow \quad \lim _{ b\rightarrow a }{ f'\left( a \right) \left( b-a \right) =f\left( b \right) -f\left( a \right)  } \quad \Leftrightarrow \quad \lim _{ b\rightarrow a }{ f\left( b \right) =f\left( a \right) +f'\left( a \right) \left( b-a \right)  }

aの値が0に近い時を考える

\quad a=0\quad \Rightarrow \quad f\left( b \right) =f\left( 0 \right) +f'\left( 0 \right) \left( b-0 \right) \quad \Leftrightarrow \quad f\left( b \right) =f\left( 0 \right) +f'\left( 0 \right) b

ここで f\left( x \right) ={ \alpha  }^{ x }\quad ,\quad f'\left( x \right) =\alpha ^{ x }\cdot \ln { \alpha  } \quad ,\quad a=0 とすると

\quad { \alpha  }^{ b }={ \alpha  }^{ 0 }+\alpha ^{ 0 }\cdot \ln { \alpha  } \cdot b\quad \Leftrightarrow \quad { \alpha  }^{ b }=1+1\cdot \ln { \alpha  } \cdot b\quad \Leftrightarrow { \alpha  }^{ b }=1+\ln { \alpha  } \cdot b となる

これらのことをまとめると以下の事が言える

<TODO>

P532~P534は以下の要約とも考えられる

\lim _{ x\rightarrow \infty  }{ { a }^{ \frac { 1 }{ x }  } } =1
\therefore { e }^{ x }\simeq 1+x\quad \left( x\ll  1 \right)

\left( x\ll 1 \right) 」はxが1よりもずっと小さい事を表現している
極小の指数計算では値の変化が一次関数に近似する。これはグラフの線がy=1に漸近する事により発生している({a}^{0}=1だから)
この現象を利用すれば例えば低金利の貯金計算なども短時間で行う事が出来る
f:id:cqbosinko:20180208204003p:plain
そのほか以下のような計算方法も行える

P536~P537

{ e }^{ \pm t }\simeq 1\pm t \quad \left( t\ll 1 \right) \\ t=xk\quad \Rightarrow \quad { e }^{ \pm xk }\simeq 1\pm xk\quad \Leftrightarrow \quad \left( 1\pm x \right) ^{ k }\simeq 1\pm xk

たとえば大きな値の平方根の近似計算に、この一次式の仕組みを利用すると…

{ \sqrt { 5031 }  }=\sqrt { 4900+131 } =\sqrt { 4900\times \left( 1+\frac { 131 }{ 4900 }  \right)  } =\overbrace { 70\sqrt { 1+\frac { 131 }{ 4900 }  }  }^{ この段階で大きな数字と小さな数字に別れている } \\ \Rightarrow \quad \left( 1\pm x \right) ^{ k }\simeq 1\pm xk\quad \Rightarrow \quad 70\times \left( 1+\frac { 131 }{ 4900 }  \right) ^{ \frac { 1 }{ 2 }  }\simeq 70\times \left( 1+\frac { 131 }{ 4900 } \times \frac { 1 }{ 2 }  \right) \\ \therefore { \sqrt { 5031 }  }=70.9295\simeq 70\times \left( 1+\frac { 131 }{ 4900 } \times \frac { 1 }{ 2 }  \right) =70.9357

これは平方根の中身の値が大きくなるほど精度が向上していく(xの分母が大きくなっていく為)

それとは別に計算尺を利用した計算の際の加算減算でよく似た考えを利用することがある
参考資料:
計算尺での足し算・引き算

ネイピア数の定義

未知数eの指数関数を考える(資料書籍:ふたたびの微分積分P178 自然対数の底ネイピア数)の定義その1)

f\left( x \right) ={ e }^{ x }\\ f'\left( x \right) =\lim _{ h\rightarrow 0 }{ \frac { f\left( x+h \right) -f\left( x \right)  }{ h }  }

この指数関数をx=0の周りで微分すると

\displaystyle f'\left( 0 \right) =\quad \lim _{ h\rightarrow 0 }{ \frac { { e }^{ 0+h }-{ e }^{ 0 } }{ h }  } \quad =\quad \lim _{ h\rightarrow 0 }{ \frac { { e }^{ 0 }\cdot { e }^{ h }-{ e }^{ 0 } }{ h }  } \quad =\quad \lim _{ h\rightarrow 0 }{ \frac { 1\cdot { e }^{ h }-1 }{ h }  } \quad =\quad \lim _{ h\rightarrow 0 }{ \frac { { e }^{ h }-1 }{ h }  }

ネイピア数として、この未知数eを扱うと考えるとx=0の時、その傾きは1として扱うので

\displaystyle f'\left( 0 \right) =1

従ってネイピア数の定義は

\displaystyle \lim _{ h\rightarrow 0 }{ \frac { { e }^{ h }-1 }{ h }  } =1

となり、このeがネイピア数となる。この式を変形すると

\lim _{ h\rightarrow 0 }{ \frac { { e }^{ h }-1 }{ h }  } =1\quad \Leftrightarrow \quad \lim _{ h\rightarrow 0 }{ { e }^{ h }-1 } =h\quad \Leftrightarrow \quad \lim _{ h\rightarrow 0 }{ { e }^{ h } } =1+h\quad \\ \therefore \lim _{ h\rightarrow 0 }{ { e }^{ h } } =1+h\quad \Leftrightarrow \quad { e }^{ x }\simeq 1+x\quad \left( x\ll 1 \right)

ここで「虚数の情緒」の記述と「ふたたびの微分積分」の記述は繋がる(表現が違うだけで意味は同じ)

対数定規を作る

書籍:虚数の情緒P553「手動計算機をつくろう」を参考に計算尺を自作してみます

作成にはグーグルスプレッドとアドビ:イラストレーターを利用する
底を10に設定した対数関数の値を利用して横幅10センチメートルの定規を作り計算結果を確認します

f:id:cqbosinko:20180215220928p:plain

具体的な作成手順

1.グーグルスプレッドを開き「=LOG10(A2)*10」のような関数を利用して以下の様な底10の対数表を作成します。イラストレーター上で横幅10センチメートルの定規を作る為×10しています
docs.google.com

2.イラストレーターの長方形ツールを利用して中身透明色、線黒色の長方形を重ねて描いて行きます。この時、ポイント吸着機能を利用して長方形左上から数値入力形式でツールを利用して横幅にスプレッドシートの値をコピペして作成します(縦長の値はあらかじめ決めて置いてその値は固定値として触らないようにします)。作業的に100個の長方形を描くので少し根気が必要な作業となります。もし長方形の位置がずれても気にせず作業を続けてください。最後にオブジェクトの整列ツールを利用して「水平方向左に整列」、「垂直方向上に整列」を利用するとピッタリと収まります

3.イラストレーターで必要な位置値や定規として利用しやすい、判り易い記号を作成します。これをクローンして上下に並べます
この計算尺は一般にC尺、D尺と呼ばれるものに対応しています。関連資料:尺の名前の由来

f:id:cqbosinko:20180311112238p:plain

出来上がった定規を利用して計算結果を確認してみる

例えば「5.5\times 6=33」、「5.5\times 8=44」の計算を検証してみます。この場合、D尺を一行に二つ並べて「10の二桁目の計算」に対応させます。C尺をスライドさせて1の位置を下の定規の5.5に合わせます
f:id:cqbosinko:20180311130659p:plain
上の定規の「6」位置の延長線上を下の定規でみると「3.3」この定規は二桁目を表しているので×10して答えは「33」になります

計算式で表すと
\log _{ 10 }{ 5.5 } +\log _{ 10 }{ 6 } \quad \Leftrightarrow \quad 0.74036...+0.77815...=1.51851...
この対数式は底を10とした指数ですから指数法則の考えを利用すると
{ 10 }^{ 0.74036 }\times { 10 }^{ 0.77815 }\quad \Leftrightarrow \quad { 10 }^{ 0.74036+0.77815 }\quad \Leftrightarrow \quad { 10 }^{ 1.51851 }\quad =\quad 32.9997...\quad \simeq \quad 33
と同値であると考える事が出来ます

同様に「8」位置の延長線上を下の定規でみると「4.4」、×10して答えは「44」になります

これは入力値に対応した出力値を持つ関数の表リストを利用した計算であり、どこかsin,cos関数の加法定理に近い構造を持つ事に気が付きます

memo:
計算尺においては計算は掛算割算が基本であり単純な加算引算にはテクニックが必要となる
参考資料:
計算尺での足し算・引き算
この参考資料内のページの最後の式は接線の方程式でみられる式の形に似ている。接線の方程式は共通因子として微分係数が利用されていると考えられる?(微分係数という単位)

指数計算をしてみる

対数定規のスタイルを変えると様々な計算ルールを持つ計算機が作成できる。例えば以下の様な計算機が簡単に作れる
以下の二つはスライドさせるタイプの計算尺でなく上下の値で値を算出するタイプ

二乗計算尺
f:id:cqbosinko:20180311155117p:plain
例:上の定規のD尺が3位置の真下は{3}^{2}=9になっている。{6}^{2}=36、35の二乗は1225で桁上がりを考慮して考えるとその値の位置であっていることが見てわかる。このように指数計算の結果が計算尺を利用すると一瞬で近似値が分かるようになる。下段の定規はイラストレーターで「log10の定規」(D尺)を横方向に50%に縮小して二つ並べる事で作成している。一般にこれは計算尺でA尺と呼ばれるものに相当する。数学的にxをD尺の値、yをA尺の値にして式で表すと…

\log _{ 10 }{ y } =\log _{ 10 }{ { x }^{ 2 } } \quad \Leftrightarrow \quad \log _{ 10 }{ y } =2\log _{ 10 }{ x } \quad \Leftrightarrow \quad \frac { 1 }{ 2 } \log _{ 10 }{ y } =\log _{ 10 }{ x }  を意味している
従って \log _{ 10 }{ y } =2\log _{ 10 }{ x } より  y={ 10 }^{ 2\log _{ 10 }{ x }  } と言える。例えば x=3 としてみると y={ 10 }^{ 2\log _{ 10 }{ 3 }  }\quad \Leftrightarrow \quad y={ 10 }^{ 2\times 0.4771... }\quad \Leftrightarrow \quad y={ 10 }^{ 0.9542... }\quad \Leftrightarrow \quad y=9 となる

この計算尺は逆の見方をするとA尺が2位置から\sqrt { 2 } =1.4142...なども読み取れる

三乗計算尺
f:id:cqbosinko:20180311162846p:plain
例:上の定規の3位置の真下は{3}^{3}=27になっている。8の三乗は512。二乗と同様、イラストレータで上のD尺を横方向に33.33333...%に縮小し3つ並べて作成している。ポストスクリプトの高精度が発揮されるテーマである。このように「x^{ n }=a」のようなn乗の指数関数、もしくはn乗根は全て計算尺として表せる。例えば6乗の値、6乗根を調べたいなら以下のような尺を作ればよい
f:id:cqbosinko:20180311163301p:plain
D尺7位置で下尺が{ 7 }^{ 6 }=117649の近似であることが確認できる

メモ:
折り畳まれたスケールはどうもオイラーの公式を利用しているらしい。πに対しての対数?

ネイピア数を利用した指数計算

自然対数の底、2.718281828...をネイピア数と呼び数学では「e」と表す。この数を底とした指数関数のグラフは積分微分の計算をしても形が変わらず合同な指数関数グラフになる
f:id:cqbosinko:20180314142943p:plain

そのため計算上の利便性が高く、また自然科学の現象を観察し数式で表そうとすると、あらゆる場面で顔を出す不思議な性質を持つ。それらは多岐に及び確率や統計などにも及ぶ。プログラムで自然界を模倣しようとすると「\pi」と対となって利用する機会が多い。計算尺ではLL3尺などがこの値を利用している。この尺の作製に関して以下の原理を利用している(ここより\log _{ 10 }{ x }\log { x }と表記しています。\log _{ e }{ x } \ln { x } の意味になります )

\log { \left( x \right)  } =\log { \left( \ln { \left( y \right)  }  \right)  } \quad \Leftrightarrow \quad \overbrace { x=\ln { \left( y \right)  }  }^{ 対数の性質:\log { p } =\log { q } \Leftrightarrow p=qより }

この式は非常に興味深い構造をしている。両辺は対数関数「\log {  } 」のゲタを履いている状態であり、それでいて式の入出力は「x=\ln { \left( y \right)  } 」となっている。これは計算尺を作る場合に置いて意味を持つ。とにかくデーターを見てもらって実際に定規を作成して貰ったほうが話は早い。LL3尺の作成に関して以下のようなスプレッドシートを作成した

docs.google.com

「LL3尺=y」に対し「C尺=x」として、以下の計算尺の状態を追いかけてみる

f:id:cqbosinko:20180315141656p:plain

 y=10とすると方程式は「\log { \left( x \right)  } =\log { \left( \ln { \left( 10 \right)  }  \right)  } 」となる。未知数xを求めるとする

右辺の内括弧のなから計算していくと \\ \ln { 10 } =2.3025 となる。従って右辺は  \log { 2.3025 } =0.3622 となり、方程式は  \log { x } =0.3622 となる
これを対数関数から逆関数の性質を利用して指数関数に直すと  x={ 10 }^{ 0.3622 }=2.3025 となる

もう一例。LL3尺を y=100とすると\log { \left( x \right)  } =\log { \left( \ln { \left( 100 \right)  }  \right)  } \quad \Leftrightarrow \quad x=\ln { 100 } \quad \Leftrightarrow \quad x=4.6051...となる

通常の指数計算もできる
例えば {7}^{2} や {7}^{3} をこの計算尺を利用して計算してみる。この場合、上側のC尺を横方向にスライドさせて1の部分をLL3尺の7に合わせる。そのままC尺の2の位置の真下のLL3尺の値を読む

f:id:cqbosinko:20180315143628p:plain

他にも {45}^{2} や {45}^{3} を求めてみる。この場合は桁上がりを考えながら尺を利用する。C尺の1をLL3尺の4.5の位置に合わせる。後はC尺の2や3の位置のLL3尺を読み桁上がりを計算する

f:id:cqbosinko:20180315145145p:plain

このように計算尺を利用して複雑な指数計算の近似値を求めることが可能となる。尺なので大雑把な値の位置を掴む事になるが非常に短時間で一発で値がわかるので便利といえる。昔の天文学者や航海士たちはこのような計算尺を利用して様々な値を算出し計算していたと考えられる。この計算尺の指数計算の動作原理は以下のように数式化出来ると考えられる…

<TODO>

論理と証明の基本

論理の道具箱

偶数、奇数の四則演算の特徴

偶数×奇数=偶数
偶数×偶数=偶数
奇数×奇数=奇数

偶数+奇数=奇数
偶数+偶数=偶数
奇数+奇数=偶数

偶数×偶数=偶数の証明

偶数:\left\{ \forall n\in \mathbb{Z}|2n \right\}
奇数:\left\{ \forall n\in \mathbb{Z}|2n-1 \right\}

命題:\exists  n\in \mathbb{Z},m={ \left( 2n \right)  }^{ 2 }\Rightarrow m=2n
この真偽を判断する。左辺を変形して整数部分を見つける
m=\left\{ \forall l\in 2{ n }^{ 2 }\in \mathbb{Z}|2l \right\} \quad \Rightarrow \quad m=\left\{ \forall n\in \mathbb{Z}|2n \right\}
集合として結論付ける
\therefore true,\quad { \left( 2n \right)  }^{ 2 }\subset 2n

ド・モルガンの法則

\overline { A\cap B } =\overline { A } \cup \overline { B } \\ \overline { A\cup B } =\overline { A } \cap \overline { B }

A={ \left\{ 6の倍数 \right\}  }=\left\{ 6z|z\in { Z } \right\} =\left\{ { 6,12,18,24,30,36,42,48,54,60,66,72,78,84,\cdots  } \right\}
B={ \left\{ 8の倍数 \right\}  }=\left\{ 8z|z\in { Z } \right\} =\left\{ { { 8,16,24,32,40,48,56,64,72,80,88,96,104,112, }\cdots  } \right\}
A\cap B=AかつB。AとBの積集合(intersection)=\left\{ 6と8の最小公倍数(LCM)の倍数 \right\} =\left\{ 24の倍数 \right\} =\left\{ 24z|z\in { Z } \right\} =\left\{ 24,48,72,\cdots  \right\}
A\cup B=少なくともAまたはB。AとBの和集合(union)=\left\{ 6または8の倍数 \right\} =\left\{ 6,8,12,16,18,24,30,32,36,40,42,\cdots  \right\}
\overline { A } ={ \left\{ 6の倍数の否定 \right\}  }=\left\{ \neg 6z|z\in { Z } \right\} =\left\{ 1,2,3,4,5,7,8,9,10,11,13,14,15,16,17,19,20,21,22,23,25,26,27,28,29,31,32{ ,\cdots  } \right\}
\overline { B } ={ \left\{ 8の倍数の否定 \right\}  }=\left\{ \neg 8z|z\in { Z } \right\} =\left\{ 1,2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33{ ,\cdots  } \right\}
\overline { A\cap B } =\overline { A } \cup \overline { B } =ド\cdot モルガンの法則より、AとBの積集合の否定=集合Aの否定と集合Bの否定の和集合
\overline { A\cap B } =\overline { A } \cup \overline { B } =\left\{ 24の倍数の否定 \right\} =\left\{ \neg 24z|z\in { Z } \right\} =\left\{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,\cdots  \right\}
\overline { A\cup B } =\overline { A } \cap \overline { B } =ド\cdot モルガンの法則より、AとBの和集合の否定=集合Aの否定と集合Bの否定の積集合
\overline { A\cup B } =\overline { A } \cap \overline { B } =\left\{ 6または8の倍数の否定 \right\} =\left\{ 1,2,3,4,5,7,9,10,11,13,14,15,17,19,20,21,22,23,25,26,27,28,29,31,33{ ,\cdots  } \right\}

論理

基本的に論理は集合を扱っている。左辺と右辺、それぞれの集合の大小と包含関係を掴み真偽(true、false)を判定する事が目的となる

p\left( x \right) \Longrightarrow q\left( x \right)

命題(proposition)と呼ばれる、これは意味的に提案(propose)に近い。この提案に対して真偽を判定する
p\left( x \right) ならば q\left( x \right) 。この場合、p\left( x \right) を仮定、q\left( x \right) は結論となる
p\left( x \right) q\left( x \right) 十分条件q\left( x \right) p\left( x \right) の必要条件となる

この命題が必要十分条件で真である場合、集合の包含関係で表すと

\left\{ x|p\left( x \right)  \right\} \subset \left\{ x|q\left( x \right)  \right\}  

\subset」はサブセットと読む。意味は集合\left\{ x|p\left( x \right)  \right\}は集合\left\{ x|q\left( x \right)  \right\} に含まれるとなる
必要十分条件を満たした状態で、仮定は結論の集合に含まれる形になる)
ちなみに両方の集合が同じ大きさ、同じ要素の内容である場合「同値」(数学記号「\Leftrightarrow 」)となる

f:id:cqbosinko:20171003180528p:plain

論理の使用

参考資料:


xかつyが6の倍数でないならば、積xyは6の倍数でない。これを論理記号で表現すると
\overline { x\cap y } =\left\{ \neg 6z|z\in { Z } \right\} \quad \Longrightarrow \quad \overline { xy } =\left\{ \neg 6z|z\in { Z } \right\}

p\cap q は「pかつq(intersection:共通部分)」、\capはキャップと読む。上線の \overline { ~ } \neg は否定(not、negative)を意味する
\Longrightarrow は「ならば(包含)」を表し、左辺を仮定、右辺を結論と意味づける。 \mathbb{Z}は数学記号で整数を表す
 \in 」はインと読み左辺が右辺の要素であることを意味する。ここではzは任意の整数の一要素であることを表している

この仮定から導かれる結論の真偽を考えてみる。その論理が偽(false)である場合、その反例をひとつあげれば証明は完了する
この場合、x=2,y=3と仮定すればxy=6となり結論が合わない事が証明される。この命題は偽である

論理的に考える対象の集合の関係を知りたい場合、「逆」、「裏」、「対偶」を考える事が必要となる(対偶:ついになって向かい合うもの)

逆の命題。積xyは6の倍数でないならば、xかつyが6の倍数でない。
\overline { xy } =\left\{ \neg 6z|z\in Z \right\} \quad \Longrightarrow \quad \overline { x\cap y } =\left\{ \neg 6z|z\in Z \right\}

裏の命題。xかつyが6の倍数ならば積xyは6の倍数。
x\cap y=\left\{ 6z|z\in { Z } \right\} \quad \Longrightarrow \quad xy=\left\{ 6z|z\in { Z } \right\}

対偶の命題。積xyは6の倍数ならばxかつyが6の倍数。
xy=\left\{ 6z|z\in { Z } \right\} \quad \Longrightarrow \quad x\cap y=\left\{ 6z|z\in { Z } \right\}

この場合の「逆の命題」は証明が非常に難しいが、一般に対偶はもとの命題と真偽が一致することを利用すれば「逆の命題の対偶に該当する裏の命題の証明」を使って証明が可能となる

対偶

抜粋:ベストとベターの違い

出来ない事を証明するのは実は凄く難しく、出来る事を証明する何倍も何十倍も労力がかかります。
なぜなら出来る事を証明するのは、ひったひとつの方法を示せばいいのですが、出来ない事を証明するにはあるゆる可能性を全て否定しなければなりません。

重要:対偶を利用する意味はここにある。命題の意味を反転させれば証明はひとつに絞られる

隠れた命題

6の倍数は2の倍数かつ3の倍数である。この命題は必要十分である。
このように一見、無関係に見えながら同値である命題を見つける事こそが重要だとも言える
(本質的に素数因数分解の重要性がここに隠れている)

x=\left\{ 6z|z\in \mathbb{Z} \right\} \quad \Leftrightarrow \quad x=\left\{ 2z\cap 3z|z\in \mathbb{Z} \right\}

この命題の否定は

6の倍数以外は、少なくとも2の倍数以外もしくは3の倍数以外である。

x=\left\{ \neg 6z|z\in \mathbb{Z} \right\} \quad \Leftrightarrow \quad x=\left\{ \neg 2z\cup \neg 3z|z\in \mathbb{Z} \right\}

確認

\neg 2z=\left\{ 1,3,5,7,9,11,13,\cdots  \right\} \\ \neg 3z=\left\{ 1,2,4,5,7,8,,10,11,13,\cdots  \right\} \\ \neg 2z\cup \neg 3z=\left\{ 1,2,3,4,5,7,8,9,10,11,13,\cdots  \right\}

証明の道具箱

  • 不等式 p\ge q を証明するには p-q\ge 0 を示す
  • ある 変数やある関数が同値であるかどうかを判定する場合、方法には二つある。係数比較法もしくは数値代入法
  • \equiv 」 恒等性 恒等式で利用されることが多い
  • =」 相等性 方程式で利用されることが多い
  • 冪等性 ある操作を一回行っても複数回行っても結果が同じ。例:0\times 0\times 0\times 0\times 0\times 0=0\quad ,\quad 1\times 1\times 1\times 1=1 等

素因数分解の一意性

全ての正の整数は素数の積として一意に表せる

\begin{matrix} 1=1 & 5=1\times 5 & 9=3^{ 2 } \\ 2=1\times 2 & 6=2\times 3 & 10=2\times 5 \\ 3=1\times 3 & 7=1\times 7 & 11=1\times 11 \\ 4={ 2 }^{ 2 } & 8=2^{ 3 } & 12={ 2 }^{ 2 }\times 3 \end{matrix}

幾何と代数

幾何的に二つに分けられないものも代数的には二つに因数分解できる場合などがある
まっぷたつに六角形を三角形二つに分けろと言われた場合、代数的に二項式に素因数分解すればよい

f:id:cqbosinko:20171226165504p:plain

{ x }^{ 6 }-1=\left( { x }^{ 3 }+1 \right) \left( { x }^{ 3 }-1 \right)

ここで重要な考えとは、「幾何的には分解できなくても代数的に複素平面でカタチを分解できたという事」。集合として数式で表すと

{ a }_{ n }=\left\{ x|{ x }^{ 3 }+1 \right\} =\left\{ -1,\frac { 1-\sqrt { 3 } i }{ 2 } ,\frac { 1+\sqrt { 3 } i }{ 2 }  \right\} \\ b_{ n }=\left\{ x|{ x }^{ 3 }-1 \right\} =\left\{ 1,\frac { -1-\sqrt { 3 } i }{ 2 } ,\frac { -1+\sqrt { 3 } i }{ 2 }  \right\}

集合を分ける事が出来たという事は分別が付いたという事になる。証明などで別々のものとして扱えることになる

<pocketCasでの検証計算>
f:id:cqbosinko:20171226180655p:plain

素数

  • 1より大きい自然数
  • 正の約数が1と自分自身(既約性)
  • 約数の数が常にふたつ

合成数

\sqrt { 2 }有理数で無い事を証明

\sqrt { 2 } =\frac { p }{ q }

この時p,qは既約分数であるとする。従ってp,qは互いに素、素数同士である。右辺は有理数である。この式の両辺を二乗すると

\sqrt { 2 } =\frac { p }{ q } \quad \Rightarrow \quad 2=\frac { { p }^{ 2 } }{ q^{ 2 } } \quad \Leftrightarrow \quad 2q^{ 2 }={ p }^{ 2 }\quad \Leftrightarrow \quad 2\cdot q\cdot q={ p }\cdot p

両辺は素因数分解で表現された合成数であるが、その構成されている素数の数が既約されているにも関わらず異なる。両辺の素因数の要素と数があっていない。従って偽になる。

素因数分解の一意性を証明

0は無批判の仮定?

そこそも完全に無なるものがあり得るかという疑問がある

1は全ての単位の祖となる

正規化の根底には全てを1に対する比として考えるみたいなものがある?
全ての単位の祖を2と考える事も可能?⇒メルセンヌ素数

PocketCASの各機能について

数学を利用して物事を解析したり調べものをする際などに非常に便利なiOSアプリ「PocketCas」に関して記事を書いてみました。微積分、方程式の解を導く、関数をプロットしてグラフ画像として保存する等が出来ます

pocketcas.com

<英文マニュアル>

マニュアルに書かれていない詳細やちょっとわかりにくい部分を日本語で説明してみました。以下がその内容となっています

式で利用する変数や演算子の扱い

x Plot、3Dplotモードではグラフの独立変数として指定できます。☆x,yを利用したグラフの作成時、グラフの山と谷の部分に頂点が表示されタップすると値が参照できます。これは何気に重要な機能です
y Plot、3Dplotモードではグラフの従属変数として指定できます
t 式に対して「parametric」指定すると定義域を持った独立変数として指定できます。TMin、TMaxにより範囲が指定できます
T アニメーション用。アニメーションで開始値と終了値を指定して線形直線的に遷移させる事ができます
θ 遷移する極座標。例えばcos(θ)で円が描けます
r Plot、3Dplotモードではグラフに対し半径rの円を描くことができます
i 虚数
e 自然対数の底ネイピア数。exp(1)でも同じです
:= 定義。f(x)の形で関数も指定できます。変数名は文字列でも利用可能。日本語による変数名も利用できます。一度代入した値は、そのファイル内で共通の変数値として記憶されます。構文入力時のメニュー上側にある「Variables」から内容が確認、編集できます
, ベクトルをカンマで区切って書いていく事で指定できます。Plotモードでは2次、3Dplotモードでは三次のベクトルを指定するとグラフが描けます。例: cos(t),sin(t)で円弧が描ける等
% モジュロ演算子。法を求めます。例:12%5とすると、2(mod 5)みたいな意味を返してきます
^ 指数演算子
^(-1) 行列に対する演算子として逆関数を指定できます。通常の指数演算では-1乗になります
! 階乗

f:id:cqbosinko:20170721235852p:plain

やや特殊な入力や出力

  • 行列の入力

行列の入力には「InsertMatrix」機能が便利です。入力機器がiPhoneiPadの場合は望みの縦横数の空入力行列を作成して0を書き換えていくと良いでしょう。基本的にベクトル入力時も構文的に扱いは同じで縦に並ぶものがベクトルとなります

  • 従属変数の具体的な値の変化を見たい場合

「Show Value Table」機能が便利です

f:id:cqbosinko:20170722000406p:plain

関数の機能

ちょっと便利な機能としてpocketcasのメソッド部分を選択すると構文のヘルプが表示されます。インフォメーションアイコンをクリックすると詳細なヘルプが表示出来ます
f:id:cqbosinko:20170722000758p:plain

基本的なメソッドの利用

整数、実数、有理数無理数複素数三角関数等の表示について

pocketcasは適時、有理数表示、n乗根表示、もしくはネイピア数による指数表示、三角関数表示を優先するようになっている。例えばn乗根等の無理数有理数を実数として近似で表示したい場合は以下の様に指定する必要がある

≈(√(3))
≈(1/2)
approx(1/2)

f:id:cqbosinko:20170722213253p:plain

「:=」を利用した関数の作成

PocketCas上での関数作成は以下のように行う。関数の名前は文字列であれば何でも構わない。1文字の名前でも可能。関数名に日本語も利用できる

f(x):=4*x^2+5*x+12
f(2)

testmethod(x):=x^2
testmethod(3)

一次関数(a,x,c):=a*x+c
一次関数(2,3,4)

f:id:cqbosinko:20170722212758p:plain

「solve」方程式を解く

方程式を解きます。連立方程式や複数の未知数を指定して解くことができます。例:4x^2+6x+24=64の未知数xを求めたい場合

solve(4*x^2+6*x+24=64,x)

連立方程式の解を求めたい場合。例:\begin{cases} x^{ 2 }+12y=4\\ x+y=2 \end{cases}の未知数xとyを求めたい場合

solve([x^2+12y=4,x+y=2],[x,y])

虚数解を求めたい場合はcsolveメソッドを利用する

csolve(x^2+2,x)

f:id:cqbosinko:20170722212857p:plain

「seq」数列、ベクトルの作成

数列、ベクトルを作成するには以下のような方法がある

例:等差数列、初項2、差3の数列の作成

seq(2+(n-1)*3,n=1..10)

例:等比数列、初項7、比5の数列の作成

seq(7*5^(n-1),n=1..10)

f:id:cqbosinko:20170722212954p:plain

離散的なグラフを描きたい場合、この数列作成をベクトルに転用できる。例えば以下の様な二次元ベクトルの各要素に対して数列を出力すればよい

[[seq(x,x=-10..20)],[seq(x^3+2*x^2+12*x-500,x=-10..20)]]

f:id:cqbosinko:20170722213039p:plain

その他にベクトルの作成にエクセルやスプレッドシート等で作成したデータをpocketcasで利用する方法もある。例えばエクセルやグーグルスプレッドシート等で以下の様なシートを作成しcsv形式で出力する

f:id:cqbosinko:20170722213717p:plain

この出力したcsvを「New Entry」時に「Load CSV data」を利用してpocketcasから読み込んで内部のデーターを適時、抽出し利用する。以下、統計学を利用した例。エクセルやスプレッドシートでも同様の事が比較的シンプルに出来るのですがPocketCasで計算をメインにした解析をする場合、それなりにメリットはあると思います

f:id:cqbosinko:20170722213142p:plain

ここでは日本語の行列データを作成、利用している

分析するデータ:=[row(A,1..10)]
男性の身長:=col(分析するデータ,1)
男性の平均身長:=mean(男性の身長)

f:id:cqbosinko:20170722222517p:plain

データをうまく扱うには行列の向きに注意する必要がある。linear_regressionメソッドはグラフ上に散らばった行列データから回帰直線を求めるメソッドであり、その入力データを正しく処理する為にtrnメソッドで転置して渡している。ベクトル「トレンドライン」に出力としてスロープ(傾き)やインターセプター(切片)が二次ベクトルとして値が収納されるので関数g(x)に一次関数の形で取り出して割り当てている

回帰分析したいデータ:=trn([[seq(a,a=1..10)],男性の身長])
トレンドライン:=linear_regression(回帰分析したいデータ)
g(x):=トレンドライン[0]*x+トレンドライン[1]

f:id:cqbosinko:20170722221717p:plain

以下で回帰直線と、その元となる男性の身長のグラフを表示している

trn(回帰分析したいデータ)
g(x)

f:id:cqbosinko:20170722222302p:plain

「diff」微分方程式を解く

微分は以下の様にすると求められる。pocketcasでは「'」を利用した導関数表記にも対応している。例えばf\left( t \right) =4.9{ t }^{ 2 }+30\quad \longmapsto \quad f'\left( t \right) =9.8tの様な微分f(x)=3x^{ 2 }+5x+25の様な微分は以下の様に計算できる

diff(4.9*t^2+30,t)

f(x):=3*x^2+5*x+25
f'(x)
f'(4)

f:id:cqbosinko:20170722213842p:plain

また複雑な偏微分等の計算も求める事が出来る。この場合はdiffメソッドを利用して偏微分する変数を明確に指定する手法となります

以下、例:(この例ではa,bの二変数持つ関数Lに対して合成関数の微分偏微分を同時に利用して計算しています)
L\left( a,b \right) =\frac { 1 }{ 2 } { \left( y-ax-b \right)  }^{ 2 }\\ \frac { \partial L }{ \partial a } =\frac { 1 }{ 2 } \cdot 2\cdot \left( y-ax-b \right) \cdot -x=a{ x }^{ 2 }+bx-xy\\ \frac { \partial L }{ \partial b } =\frac { 1 }{ 2 } \cdot 2\cdot \left( y-ax-b \right) \cdot -1=a{ x }+b-y

simplify(diff(1/2*(y-a*x-b)^2,a))
simplify(diff(1/2*(y-a*x-b)^2,b))

f:id:cqbosinko:20170726000100p:plain

「simplify」式を整理する

上記でdiffメソッドと同時に利用しているsimplifyメソッドは式を可能な限り整理して見やすい形で出力します

「integrate」積分

積分は以下の様にすると計算できます
以下、例:
\int _{ 0 }^{ 1 }{ n^{ 2 }dn } ={ \left[ \frac { 1 }{ 2+1 } n^{ 2-1 } \right]  }_{ 0 }^{ 1 }=\frac { 1 }{ 3 } \\ \int _{ 0 }^{ 1 }{ \frac { 1 }{ 1+{ x }^{ 2 } } dx }

integrate(n^2,n,0,1)
∫(1/(1+x^2),x,0,1)

f:id:cqbosinko:20170726000132p:plain

「limit」極限を求める

極限計算を利用したい場合は以下の様にします

limit(1/n,n,∞)
limit((x^2-3*x+2)/(x-2),x,2)

f:id:cqbosinko:20170726000225p:plain

「sum」総和

∑(1/n^2-3,n,1,17)
sum(a+(n-1)*d,n,1,10)
sum(5+(n-1)*3,n,1,10)

f:id:cqbosinko:20170726000256p:plain

「nCr」二項定理

nCr(5,3)

f:id:cqbosinko:20170726000326p:plain

「expand」式の展開

expand((x+1)^5)

f:id:cqbosinko:20170726000352p:plain

その他の便利な関数

以下、個人的に調べた範囲で細々とした関数の機能を網羅しています。限定的な機能に特化したものが多いです

最大公約数
gcd(18, 15, 24)
→3

最小公倍数
lcm(18, 15, 24)
→360

素因数分解
ifactor(90)
→ 2*3^2*5
≈ 90.0

因数分解
factor(x^2+6x+8)
→ (x+2) * (x+4)

一番近い有理数を返す
float2rational(1.4142)
→ 7071/5000

連分数を返す
dfc(root(2))
→ [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2]

素数判定
is_prime(7)
→1

一つ前の素数
prevprime(7)
→5

1つ後の素数
nextprime(7)
→11

n番目の素数
ithprime(5)
→11

割り算の商のみを求める(190/12=15)
iquo(190, 12)
→15

割り算の余りのみを求める
irem(190, 12)
→10

割り算の商と余りを出力する
iquorem(190, 12)
→ 15, 10

除数の羅列
idivis(36)
→ [1, 2, 3, 4, 6, 9, 12, 18, 36]

偶数判定
even(16)
→1

奇数判定
odd(15)
→1

べズーの恒等式
48○+30○=18の丸部分を求める
iabcuv(48, 30, 18)
→ 6, −9

三平方の定理 c^2=a^2+b^2 のa,bを求める
pa2b2(17)
→ 4, 1

メモ

48ページまでチェック

中国の剰余定理(要調査)
ichinrem()