# project Y3S3 ## 確認事項(20/03/23) - プロジェクト名は「Y3S3」に変更 →Yasuo Yamasaki,Yutaro Sumi,So Suzuki - はじめには、最後に修正する。 →主担当:山崎 - 全体構成については、全員で確認、箇条書きレベルで追記する。 <一応の目安> ① 3/23(月)~3/30(月):鈴木さん ② 4/7(火)大会論文なので中断 ③ 4/10(金)~4/17(金):角さん - 3章pythonを対象とした理由の担当は、角さん - 6章?のメインとなるプログラムのフロー担当は、山崎 - 鈴木さん作成のプログラムの確認 - 6章で用いる記号の整理は、鈴木さん →記号を整理して、5章の学習用プログラムを修正 →学習用プログラムの追記修正 - 5章の学習用プログラムについては、次回打合せ予定。 →GW前(4/20の週)に打合せしませんか? **参考となるネット情報** 1. [【読書メモ】実践力を身につけるPythonの教科書](https://scrapbox.io/Porin-Room/%E3%80%90%E8%AA%AD%E6%9B%B8%E3%83%A1%E3%83%A2%E3%80%91%E5%AE%9F%E8%B7%B5%E5%8A%9B%E3%82%92%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%82%8BPython%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8) 2. [Pythonで1自由度非減衰系の自由振動シミュレーション](https://watlab-blog.com/2019/06/09/python-1dof-simulation/) 3. [Pythonで運動方程式を解く](https://qiita.com/damyarou/items/7cbb44ffde9546a94682) 4. [Python プログラミング  2質点系時刻歴応答解析 NewMarkのβ法](http://jz6t.blogspot.com/2014/02/python-response-analysis-of-multi.html) 5. [連成振動をpythonでシミュレーションしてみた](https://yoschi0831.hatenadiary.org/entry/20110419/1303198476) 6. ## 0.はじめに #### 目的 - 以下の対象者を想定して、pythonによる地震応答解析のプログラムの作成方法の学習用の資料とする。 #### 対象者 - 地震応答解析を理解したいひと - 建築学科の学生、卒業生であるがプログラムに興味があるひと - 地震応答解析プログラムを自作したいひと - 地震応答解析を行いたいが市販ソフトを買えないひと - 学生時代にfortranなどを使っていたが、pythonを使ってみたいひと - 主な対象者:大学生、大学院m1、社会人3年目まで > [name=so-suzuki]社会人3年目までって必要でしょうか。 ⇒それ以上の人は、別の教材で勉強してください。 #### 到達目標 - 地震応答解析の理解(大学の授業レベル)できる。 - 質点系の地震応答解析プログラムを自力で作成出来るようになる。 ⇒本書では、プログラム言語はpythonを採用したが、他の言語でも作成できるよう解説する。 #### 本書の立ち位置 - 質点系地震応答解析のプログラムに関する記事(サイト)はネット上に星の数ほどある。 - しかし、各記事の殆どがそれぞれ以下の事項についての説明が不十分と感じる。 →それぞれ目的が異なるためか、まとまったものがないってこと。 →プログラム作成メモ的なものが殆どと感じる。 - 地震応答解析の理論展開 - 質点系プログラムへの落とし込み方 →特にこの部分を、きちんと書きたい。 - プログラムの詳細 - プログラムの応用の方法 - また、pythonの構文に関する情報を掲載したサイトは原子の数ほどあるが、質点系応答解析プログラム作成のためのみのサイトは、殆ど見当たらない。 - 本書では、質点系応答解析プログラム作成のための確実な知識とプログラム作成までを最短で行えるように構成していきたいと考えている。 #### 本書の構成 - 地震応答解析の理論展開 ⇒概要レベルではなく、大学の授業レベルが目標  →柴田先生の本をよりかみ砕いて、説明。 ⇒インパルス応答からにするか? - 1質点系地震応答解析プログラム作成のために必要なpythonの構文 ⇒まずは1質点系を対象とする。  →多質点系については、今後。 - 1質点系地震応答解析プログラム作成方法 ⇒どのように考え、作成していくべきかを記す。 - 1質点系地震応答解析プログラム作成 >以下は、これから考える。 > >- 応答スペクトル概要、作成方法、作成 >- エネルギーの時刻歴 >- 弾塑性系 >- 多質点系への理論展開、作成方法、作成 ## 1.目 次(概要) 0. はじめに 1. 目 次 2. 地震応答解析の理論展開 - 柴田先生をよりかみ砕いて説明する。 - ニューマークのβ法の式展開(平均加速度法、線形加速度法) > [name=so-suzuki] > 学生向けでもあるなら、そもそもなぜ地震応答解析というものが必要になるのかにも軽く触れたい気がしました。 2.1 構造物のモデル化 > <柴田先生 「最新 耐震構造解析 第2版」p.1> > > 構造物を解析する場合には、まず構造物を解析可能な力学モデルに置き換える必要がある。 > > 実際の構造物はきわめて複雑であるから、モデルの設定に際しては、問題となる振動現象が実用上十分な精確さで表される程度に、構造物を理想化し、単純化しなければならない。 d’Alembertの原理を用いて釣合い式をたてると、地動を受けるM-C-K型の運動方程式となる。 ```math [−𝑚(𝑦 ̈+𝑦 ̈_0 )]+(−𝑐𝑦 ̇ )+(−𝑘𝑦)=0 ``` 外力の時刻歴が単純な関数の場合 ex.)-my ̈_0=f(t)=Fcos(pt) ⇒ 微分方程式の解を数学的に解くことが可能 外力の時刻歴がある関数で表現できない場合 ex.)地震および風など ⇒ 微分方程式の解を数学的に解くことが不可能 ​ →数値積分法を用いる。 2.2 数値積分法 地震動のような不規則な外乱を受ける構造物の動的応答を解析するためには、微小な時間間隔ごとに運動方程式を数値的に積分して解を定めてゆく数値積分法が多く用いられる。 時刻tiまでの応答状態yiが分かっているとき、微小な時間Δt後の時刻ti+1における状態yi+1を近似的に推定し、この操作を順次繰り返して解を求めていく方法。 2.2.1 線形加速度法 2.2.2 平均加速度法 2.2.3 ニューマークβ法 3. pythonについて - なぜpythonを対象にしたのか? - 流行りだから?なぜ流行っているのか? →AI関係、CSVとの相性、フリーソフト、パッケージが多数公開、情報はいくらでもあるとか。 - プログラミングしやすい。 - 誰が書いても大体同じになる。 - python3.0を対象としていること。 - Anaconda (アナコンダ) をインストールして使用することを想定していること。 - Numpyは”ナンパイ”などの一般的な呼ばれ方も記載すること。 4. pythonによるプログラム例題 - 解説をどの程度書くべきか。 - ① print文 - 何はともあれ、まずはHello World! > [name=so-suzuki] > このレベルから説明するというより、作りたい例題(たとえば、sin波作成)とかを > まず示して、そのうえで必要なパーツとして一つ一つ構文を解説するほうが理解しやすいかもと思いました。 > ```Python:hello.py print("Hello World!") ``` ②整数と実数 - データの入力、計算、出力について ```Python:int&float.py #データの入力、計算、出力 inp_d1 = input("数を入力してください!d1=\n") inp_d2 = input("数を入力してください!d2=\n") #int:整数 print("整数で足し算した結果:", int(inp_d1) + int(inp_d2)) #float:実数 print("実数で足し算した結果:", float(inp_d1) + float(inp_d2)) ``` ③for文によるループ処理 ```Python:for文.py for num in range(100): print(num) if num == 25: break ``` - 多重ループも ④sin波作成と図化 - FFTまでやってみる。 - 少しやりすぎ? - FFTについては、コメント程度で詳細は別途 ```Python:WaveFFT.py import numpy as np import matplotlib.pyplot as plt #データのパラメータ N = 256 #サンプル数 dt = 0.01 #サンプリング間隔 f1,f2 = 10,20 #周波数 t = np.arange(0, N*dt, dt) #時間軸 freq = np.linspace(0, 1.0/dt, N) #周波数軸 #信号を生成(ランダムノイズ) #f = np.random.randn(N) #信号を生成(周波数10の正弦波) #f = np.sin(2*np.pi*f1*t) #信号を生成(周波数10の正弦波 + 周波数20の正弦波 + ランダムノイズ) f = np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t) + 0.3*np.random.randn(N) #高速フーリエ変換 F = np.fft.fft(f) #振幅スペクトルを計算 Amp = np.abs(F) #グラフの表示 plt.figure() plt.rcParams['font.family'] = 'Times New Roman' plt.rcParams['font.size'] = 17 plt.subplot(121) plt.plot(t, f, label = 'f(n)') plt.xlabel("Time", fontsize = 20) plt.ylabel("Signal", fontsize = 20) plt.grid() leg = plt.legend(loc = 1, fontsize = 25) leg.get_frame().set_alpha(1) plt.subplot(122) plt.plot(freq, Amp, label = '|F(k)|') plt.xlabel("Frequency", fontsize = 20) plt.ylabel("Amplitude", fontsize = 20) plt.grid() leg = plt.legend(loc = 1, fontsize = 25) leg.get_frame().set_alpha(1) leg = plt.legend(loc = 1, fontsize = 25) leg.get_frame().set_alpha(1) plt.show() ``` ⑤入力地震波の読み込みと図化 ```Python:WaveReader.py import numpy as np import matplotlib.pyplot as plt f=open('El CentoroNS.txt') line=f.readlines()[1:] f.close() N = 2688 wave=[] for i in range(0,N): wave.append(float(line[i])) print(wave[i]) #グラフ表示 plt.figure(figsize=(8,4)) plt.xlabel('N') plt.ylabel('acc') plt.plot(wave) plt.show() ``` ⑥データの出力 ```Python:output.py text = '時刻歴応答解析は難しくない。' file = open('text1.txt','w') file.write(text) file.close() ``` ⑦def文による処理 ```Python:def文.py def add(a, b): return a + b #data1 = 4 #data2 = 3 data1 = input("data1を入力してください。\n") data1 = int(data1) data2 = input("data2を入力してください。\n") data2 = int(data2) x = add(data1, data2) print(x) ``` 5. pythonによるプログラムへの落とし込み方 - 前ステップから求めることを記す。 - どこをどのようにループさせるかを記す。 - フローチャートを記す。(プログラム完成後に修正) ```flow st=>start: 処理開始 e=>end: 処理終了 io1=>inputoutput: 質点系データ入力(質量m、周期T、減衰定数h) io2=>inputoutput: 解析データ入力(解析方法β、積分時間間隔ddt) op1=>operation: 準備計算1(剛性k、減衰係数c) sub1=>subroutine: 地震動データ入力と分割(データ数N、刻み時間dt) cond=>condition: ループの開始 op2=>operation: i=0 op3=>operation: i=NN+1 sub2=>subroutine: 外力f、加速度acc、速度vel、変位dis op4=>operation: 出力処理 st->io1->io2->op1->sub1->op2->cond cond(yes)->op3->op4->e cond(no)->sub2->cond ``` > [name=so-suzuki] > 結果を確認する、というフェーズがあったほうがやった感があっていい気がしました。 >