<jupyter_start><jupyter_text>はじめに本実験では，PythonとGoogle Colaboratory（以下，Colab）を使用して，力学系の数値解析手法を学ぶ．PythonとColabの特徴は以下のとおり．- Pythonとは  - プログラミング言語の1つで，現在，広く利用されている．- Google Colaboratory（Colab）とは  - ブラウザ上で Python を記述して実行できるツール．    - 具体的には，まずブラウザで表示されるノートブック（今開いているこのページが1つのノートブックである）を作成し，そこにPythonコードの記述と実行を行う．    - Pythonコードの他に，テキストも入力できる    - 連続使用が12時間を超えるか，ノートブックを90分程度操作しないと，自動的に切断される．    - 上記の制約のため，ノートブックを細かく保存すること（保存方法は次に説明する）Colabの概要について説明している，[Google Colaboratory の開始方法 (日本語字幕あり)](https://www.youtube.com/watch?v=inN8seMm7UI)を視聴すること．  実験の進め方本実験では，Colabのノートブックを使って進めていく．ノートブックは，複数のセルから構成されている．セルには，文字を入力するための`テキストセル`，Pythonのコードを入力するための`コードセル`がある．セルに書かれた説明を読み，コードを実行していくことで，内容の理解を深めてほしい．特に，（TODO）と書かれた指示は必ず実行すること．ノートブックの内容を順に理解していけば，最後のレポート課題が解けるはずだ．ノートブックには，各自がコードの追加や，実行ができる．プログラムを学ぶためにその動作を確認することは重要なので，積極的にコードを書き，実行してみること．その試行錯誤の過程でノートブックを壊滅的に壊してしまった場合でも，この初期状態から再開できる．その場合は，[実験のTopページ](https://github.com/yyamnk/numerical-methods-py3/blob/master/uu_experiment.md)からやり直すこと． 次に，ノートブックの保存方法を説明する．現在，開いているノートブックは教科書用であり，編集や実行ができない状態である．そこで，次の手順で実験を進めること．1. [実験のTopページ](https://github.com/yyamnk/numerical-methods-py3/blob/master/uu_experiment.md)から，教科書用ノートブックを開く（今ここ）2. 下図のように，ブラウザの左上から`ファイル` -> `ドライブにコピーを保存`をクリックし，ノートブックを各自のGoogle Driveへ保存する．3. コピーしたノートブックが開かれたら，それを編集・実行しながら学習を進める．![図1 ノートブックの保存](https://docs.google.com/uc?export=download&id=1_0LtxmcJs4FmNjKKKNvr41qCNKNG4aoE)保存したコピーが開けたら，実験を始めよう．  四則演算まず最初に，Pythonによる四則演算を学ぶ．Pythonコードの入力と実行は，次の手順で行う．1. ブラウザ左上にある「+ コード」をクリックして`コードセル`を追加2. 追加されたセルをクリックし，プログラムを記述3. セルの左端にある「▷（再生ボタン）」をクリックして，セルを実行する  - [方法がわからない場合は，ここを視聴せよ](https://youtu.be/inN8seMm7UI?t=27)ここでは，例として，既にPythonコードを入力したセルを用意した．このセルを実行してみよう．<jupyter_code># ここはコメント．Pythonは#記号以降の文字を無視する．

1 + 5 # 和，このセルを実行すると，計算結果が出力される（初回の実行では多少の時間がかかる）<jupyter_output><empty_output><jupyter_text>セルを実行すると，結果が出力されたはずだ． （TODO）適当な2つの数の，差・積・商を計算するコードを作成し，実行せよ．ここでは，1つのセルに1つの四則演算のみとすること．また，手計算と比較して動作を確かめよ．<jupyter_code># 差を計算するコード

# 積を計算するコード

# 商を計算するコード<jupyter_output><empty_output><jupyter_text>累乗Pythonでは，累乗を`**`で表す．（TODO）次のコードを実行して動作を確かめよ．<jupyter_code>2 ** 3 # 2の3乗（2 ^ 3）
2 ** 0.5 # 2の平方根<jupyter_output><empty_output><jupyter_text>複素数Pythonでは，複素数の演算もサポートされている．虚数には`j`をつけること．（TODO）以下のセルを実行し，動作を確認せよ．<jupyter_code>(1 + 2j) + (3 + 4j)<jupyter_output><empty_output><jupyter_text>変数Pythonでは，数値等を変数に代入できる．ここでは変数の定義・代入と，変数を使った計算をやってみよう．（TODO）以下のセルを実行し，動作を確認せよ．<jupyter_code>x = 10 # `x`という変数を定義し，10を代入する．
# 代入のみの場合，このセルを実行しても出力は無いが，内部で処理はされている．<jupyter_output><empty_output><jupyter_text>このように定義した変数は，同一のnotebookでいつでも参照できる．<jupyter_code>x # 定義した変数の参照方法1: 変数のみを書く
print(x) # # 定義した変数の参照方法2: print()を用いる<jupyter_output><empty_output><jupyter_text>（TODO）次のセルを実行し，変数を用いた四則演算ができることを確かめよ<jupyter_code>r = 5 # 新たな変数を定義
pi = 3.14 # 新たな変数を定義, 変数名には複数の文字を使っても良い
2 * r * pi # 変数を使って計算する．<jupyter_output><empty_output><jupyter_text>プログラム例：2次方程式の解の公式ここまでの知識で，2次方程式の解を計算するプログラムを考えてみよう．$$a x^2 + b x + c = 0$$の解は，解の公式より$$x = \frac{-b \pm \sqrt{b^2 - 4 a c}}{2a}$$である．（TODO）次のセルを実行し，解が計算できることを確かめよ<jupyter_code>a = 1
b = -6
c = 13

(-b + (b ** 2 - 4 * a * c) ** 0.5) / (2 * a) # 1個めの解
(-b - (b ** 2 - 4 * a * c) ** 0.5) / (2 * a) # 2個めの解<jupyter_output><empty_output><jupyter_text>Numpy 配列プログラミングでは，複数の要素（値）の集合を管理したいことがある．これを実現するデータ構造を配列と呼ぶ．Pythonには，配列を実現する方法はいくつかあるが，本実験では，`Numpy 配列`を用いる．基本的な使い方は以下の通り．（TODO）以下のセルを実行し，動作を確認せよ<jupyter_code># Numpyを用いるためにライブラリを読み込む．
import numpy as np  # これにより，以降のセルでは`np`と書くことでnumpyの機能が使える．
# 次に，配列を定義する．
xs = np.array([1, 2, 3, 3, 5]) # 要素は[]で指定する
xs # 確認のため，xsを出力する
# 全ての要素がゼロの配列も定義できる．ここでは要素が5個の配列を定義する．
xs = np.zeros(5)
xs # 確認のため，xsを出力する
# 定義したNumpy配列へ値を代入する
# 代入するときは，0からはじまる配列の要素番号を指定し，`=`で値を代入する
xs[0] = 10 # 配列の先頭に代入
xs[1] = 20 # 2番目の要素に代入
xs[2] = 30 # 3番目の要素に代入
xs # 確認のため，xsを出力する
# 配列の要素を呼び出したい場合は，`配列名[インデックス番号]`とする
xs[2]<jupyter_output><empty_output><jupyter_text>数値計算でよく用いるのは，初期値，値の刻み幅，最終値から配列を作成することだ．これは，次のように記述できる．<jupyter_code>ts = np.arange(start=10, stop=15, step=0.5) # 初期値10, 終了値15, 刻み幅0.5の数列を定義する
ts<jupyter_output><empty_output><jupyter_text>関数プログラムでは，頻繁に実行する手続き・処理がある．このような処理を，いつでも使えるように部品のような形にまとめたものを`関数`という．Pythonには便利な関数が予め実装されている．このような関数を組み込み関数と呼ぶ．組み込み関数の例として，- 配列の長さを返す`len()`- Numpy配列の要素の平均を返す`np.mean()`- Numpy配列の絶対値を返す`np.abs()`- Numpy配列の$\cos, \sin$を返す`np.cos()`, `np.sin()`などがある．`()`の中には変数を書く．これを引数と呼ぶ．また，関数の出力は返り値と呼ばれる．（TODO）以下のセルを実行し，動作を確認せよ<jupyter_code>len(xs) # 配列の長さを出力する（引数：配列xs, 返り値：xsの要素数）
np.mean(xs) # 配列の各要素の平均を出力する（引数：配列xs, 返り値：xsの要素の平均）
np.abs(np.array([-1, 2, -3, 4])) # 配列の各要素の絶対値を出力する<jupyter_output><empty_output><jupyter_text>Pythonでは，組み込み関数だけれはなく，ユーザが独自定義する関数も利用することができる．ここでは関数の定義と実行を行ってみよう．変数$x$から次の$y$を算出する関数を考える．$$y = ax + b$$ここで，$a=10$, $b=3$とすると，Pythonコードは次のようになる．（TODO）以下のセルを実行し，動作を確認せよ<jupyter_code># 関数の定義
def myfunc(x): # 関数の定義は，def 関数名（入力変数）: で行う．
  # 関数内のコードは，インデント（行頭に半角スペース2個を入れること）する．
  a = 5 # 変数を定義（この変数は関数の中でのみ有効）
  b = 3
  y = a * x + b
  return y # 返り値はreturnで書く．
# 関数の実行，組み込み関数と同様に`関数名(引数)`とする
myfunc(5)<jupyter_output><empty_output><jupyter_text>（TODO）以下のセルに，`myfunc`の引数を`10`と`20`としたコードを書き，出力を確認せよ．<jupyter_code># 引数が10のコード

# 引数が20のコード<jupyter_output><empty_output><jupyter_text>for文ある処理を繰り返すとき，for文を用いる．例えば，「0から`n`まで，1刻みの数字を表示する」という処理を考えよう．このとき，```print(0)print(1)...(略)...print(n)```と書くのは大変だが，for文を使えば以下のように書ける．（TODO）以下のセルを実行し，動作を確認せよ<jupyter_code># 0からnまでの数字を表示するプログラム
n = 10
for i in range(0, n + 1): # 変数`i`には，0からnまでの数字が逐次代入される．
  print(i) # iの値を画面出力する．for文内のコードはインデントする

print('終了') # この行はインデントされていないので，for文には含まれない．<jupyter_output><empty_output><jupyter_text>上記のコードでは，`print(n)`の行がインデント（行の先頭に半角スペースが2個あること）されていることがわかる．for文は，直後のインデントされたコードのみを繰り返し実行する．そのため，最後の`print(終了)`は1度のみ実行されている．  グラフの作成数値計算の結果をグラフに描写することができる．（TODO）以下のセルを実行し，動作を確認せよ<jupyter_code>from matplotlib import pyplot as plt # グラフ描写に用いるpyplotというライブラリを読み込む
# 以降，`plt`と書くことで利用できる．
xs = np.array([0, 1, 2, 3, 4]) # x軸となるnumpy配列
ys = np.array([-1, 1, -1, 1, -1]) # y軸となるnumpy配列
plt.plot(xs, ys) # plt.plot()は，最初の引数がx軸，2番目の引数がy軸となるようにグラフを作成する．
# どの変数をx軸，y軸に割り当てるかは，変数を書く順番による．
# x軸にys, y軸にxsをplotするには，次のようにする．
plt.plot(ys, xs)
# 複数のグラフを同時に描写する
plt.plot(xs, ys, 'r-') # '-r'はオプションで，plot xs and ys using red line を意味する．
plt.plot(xs, 2 * ys, 'g:') # plot using green dot line
plt.plot(xs, 3 * ys, 'b.') # plot using blue dots<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14740907627936917, 'fraction_numerical': 0.02510460251046025, 'mean_word_length': 10.906130268199234, 'pattern_counts': {'":': 0, '<': 61, '<?xml version=': 0, '>': 62, 'https://': 5, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '15', 'dir': 'jupyter-structured-clean-dedup', 'id': '5273', 'license': 'MIT', 'n_tokens_mistral': 4898, 'n_tokens_neox': 4743, 'n_words': 261, 'path': '.ipynb_checkpoints/exp_python1-checkpoint.ipynb', 'repo_name': 'yyamnk/numerical-methods-py3', 'size': '6214'}