Q&A
前提
pythonでフーリエベッセル関数を用いた級数展開法を行なっています。今基底関数系のデータを決め、それぞれの基底関数系に対応する係数を求めることはできたのですが、この求めた係数を対応する基底関数系に掛けて値を足し合わせるというところで苦労しています。最終的には設定したデータと合うように像を再構成できれば良いので等高線を描くためにcontourを利用しています。
実現したいこと
if文で場合分けしている関数の値を全て足し合わせたい
発生している問題・エラーメッセージ
明らかに異なる結果が出ているのでif文でミスがあるように思われる。27~34行を変える必要があると思われる。
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt 3from scipy.special import jv 4import pandas as pd 5import itertools 6import csv 7 8csv_file = open('coeffication.csv') #csvファイルを開く 9csv_reader = csv.reader(csv_file) #開いたcsvファイルからreaderオブジェクトを生成 10clf = [] #抽出するデータを格納する空のリストを作る 11 12for row in csv_reader: #readerオブジェクトをループしてデータ抽出 13 if csv_reader.line_num == 1: #ヘッダー行はスキップする 14 continue #Trueになる1行目はなにもしない 15 clf.append(row[0]) #row行目の係数データを格納 16 17csv_file.close() # csvファイルを閉じる。 18 19clf_i = [float(s) for s in clf] #配列は文字列型なのでint型に変換 20 21fig = plt.figure() 22ax1 = fig.add_subplot(111) 23x = np.linspace(0, 4*2^(1+0), 40) #等間隔で値を0~4まで20個作成 lの値はここで変える 24y = np.linspace(0, 2*np.pi, 40) #等間隔で値を0~360まで20個作成 25x, y = np.meshgrid(x, y) #x,yからメッシュグリッドを作成 26 27def fz(x,y): 28 for e in range(41): 29 if e % 2 ==0: 30 a = clf_i[e]*jv(e,x)*np.cos(e*y) 31 else: 32 b = clf_i[e]*jv(e,x)*np.sin(e*y) 33 return a+b #足し合わせる 34z = fz(x,y) 35 36x1 = x*np.cos(y) 37y1= x*np.sin(y) 38 39ax = plt.contour(x1,y1,z,colors='black') #等高線表示 40ax.clabel(fmt='%1.1f', fontsize=16) #等高線の値を表示 41ax = plt.contourf(x1,y1,z,cmap='rainbow') #等高線レベルに応じて色を塗る 42ax = plt.colorbar(label="contour level") #カラーバー表示 43 44 45plt.show()
試したこと
対応する基底関数系の像をcontourで図示したので、結果もcontourで図示しないといけないのがネックになっている。一応3次元データをプロットすれば求めているようなグラフになるのだが、contourfの場合、高度の値に二次元を求められるためにこのような冗長な式になっている。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/01/08 12:44