teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

指摘点の修正

2021/12/07 01:59

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -37,7 +37,6 @@
37
37
  #np.meshgridで格子座標を生成し、x, yの二次元ガウスの積分値の掛け算を網羅する
38
38
  mesh_x, mesh_y = np.meshgrid(diff_x, diff_y)
39
39
  np_integ = (height * mesh_x * mesh_y + constant).ravel()
40
- np_integ = np_integ.ravel()
41
40
  return np_integ
42
41
 
43
42
  #実測値 ― 計算値から最小二乗法を行う

5

グラフの削除

2021/12/07 01:59

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -77,7 +77,4 @@
77
77
  sigma:0.31
78
78
  center_x:-0.41
79
79
  center_y:0.01
80
- constant:304.71
80
+ constant:304.71
81
-
82
- fittingしたパラメータでグラフを作成しました(↓↓↓)
83
- ![fitting結果](6d3dd24db77dd208def011fc945d3226.png)

4

指摘箇所修正

2021/12/06 15:47

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -7,13 +7,18 @@
7
7
  よって処理速度の向上を目標としているのですが、良い方法が見つからないため、詳しい方がおりましたらご指摘していただければ幸いです。
8
8
 
9
9
 
10
+ 修正後のプログラム
10
11
  ```python
11
12
  import time
12
13
  import numpy as np
13
14
  from scipy import optimize
14
- from scipy import integrate
15
15
  from sympy import *
16
16
 
17
+ a = Symbol('a')
18
+ f = 1/sqrt(2)*exp(-(a**2/2))
19
+ F = integrate(f, a)
20
+ func_gauss = lambdify(a, F)
21
+
17
22
  #二次元ガウスの積分
18
23
  def integ_gaussian(param, x_range, y_range):
19
24
  height = param[0]
@@ -21,18 +26,17 @@
21
26
  cen_x = param[2]
22
27
  cen_y = param[3]
23
28
  constant = param[4]
24
- a = Symbol('a')
25
- f = 1/sqrt(2)*exp(-(a**2/2))
26
- F = integrate(f, a)
27
- #func_gaussで不定積分を定義する
28
- func_gauss = lambdify(a, F)
29
29
  #x_list, y_listに範囲内の不定積分を格納する
30
30
  #積分する回数を減らすことができる
31
31
  x_list = [func_gauss((x-cen_x)/sigma) for x in x_range]
32
32
  y_list = [func_gauss((y-cen_y)/sigma) for y in y_range]
33
- integ_list = [height * (x_list[i+1] - x_list[i]) * (y_list[j+1] - y_list[j]) + constant for i in range(len(x_list)-1) for j in range(len(y_list)-1)]
33
+ #np.diffは前後の差を求める
34
- #不定積分に積分したい範囲を代入して積分
34
+ #二次元ガウスの積分値
35
- np_integ = np.array(integ_list)
35
+ diff_x = np.diff(x_list)
36
+ diff_y = np.diff(y_list)
37
+ #np.meshgridで格子座標を生成し、x, yの二次元ガウスの積分値の掛け算を網羅する
38
+ mesh_x, mesh_y = np.meshgrid(diff_x, diff_y)
39
+ np_integ = (height * mesh_x * mesh_y + constant).ravel()
36
40
  np_integ = np_integ.ravel()
37
41
  return np_integ
38
42
 
@@ -60,20 +64,20 @@
60
64
  #optimised_param_2Dにfitting結果のパラメータが格納される
61
65
  #optimised_param_2Dの所要時間を記録する。
62
66
  time_1 = time.time()
63
- optimised_param_2D = optimize.leastsq(residuals_2D, param_2D, args = (actual_data, np_range, np_range, ftol=1.49012e-1, xtol=1.49012e-1, gtol=1.49012e-1, maxfev=4、))
67
+ optimised_param_2D = optimize.leastsq(residuals_2D, param_2D, args = (actual_data, np_range, np_range, ftol=1.49012e-1, xtol=1.49012e-1, gtol=1.49012e-1, maxfev=40))
64
68
  time_2 =time.time()
65
69
  print(time_2-time_1)
66
70
  ```
67
71
 
68
72
  処理時間
69
- time_2 - time_1 = 10.873398542404175
73
+ time_2 - time_1 = 0.007936954498291016
70
74
 
71
75
  fitting結果
72
- height:1943.04
76
+ height:1943.76
73
77
  sigma:0.31
78
+ center_x:-0.41
74
- center_x:0.01
79
+ center_y:0.01
75
- center_y:-0.42
76
- constant:304.8
80
+ constant:304.71
77
81
 
78
82
  fittingしたパラメータでグラフを作成しました(↓↓↓)
79
83
  ![fitting結果](6d3dd24db77dd208def011fc945d3226.png)

3

指摘を参考に変更を加えた

2021/12/06 15:46

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -28,18 +28,10 @@
28
28
  func_gauss = lambdify(a, F)
29
29
  #x_list, y_listに範囲内の不定積分を格納する
30
30
  #積分する回数を減らすことができる
31
- x_list = []
32
- y_list = []
33
- for x in x_range:
34
- x_list.append(func_gauss((x-cen_x)/sigma))
31
+ x_list = [func_gauss((x-cen_x)/sigma) for x in x_range]
35
- for y in y_range:
36
- y_list.append(func_gauss((y-cen_y)/sigma))
32
+ y_list = [func_gauss((y-cen_y)/sigma) for y in y_range]
37
- integ_list = []
33
+ integ_list = [height * (x_list[i+1] - x_list[i]) * (y_list[j+1] - y_list[j]) + constant for i in range(len(x_list)-1) for j in range(len(y_list)-1)]
38
34
  #不定積分に積分したい範囲を代入して積分値を求める
39
- for i in range(len(x_list)-1):
40
- for j in range(len(y_list)-1):
41
- integ_result = height * (x_list[i+1] - x_list[i]) * (y_list[j+1] - y_list[j]) + constant
42
- integ_list.append(integ_result)
43
35
  np_integ = np.array(integ_list)
44
36
  np_integ = np_integ.ravel()
45
37
  return np_integ
@@ -68,7 +60,7 @@
68
60
  #optimised_param_2Dにfitting結果のパラメータが格納される
69
61
  #optimised_param_2Dの所要時間を記録する。
70
62
  time_1 = time.time()
71
- optimised_param_2D = optimize.leastsq(residuals_2D, param_2D, args = (actual_data, np_range, np_range))
63
+ optimised_param_2D = optimize.leastsq(residuals_2D, param_2D, args = (actual_data, np_range, np_range, ftol=1.49012e-1, xtol=1.49012e-1, gtol=1.49012e-1, maxfev=4、))
72
64
  time_2 =time.time()
73
65
  print(time_2-time_1)
74
66
  ```

2

文章の追加

2021/12/05 17:00

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -83,5 +83,5 @@
83
83
  center_y:-0.42
84
84
  constant:304.8
85
85
 
86
- fittingしたパラメータでグラフを作成した
86
+ fittingしたパラメータでグラフを作成しまし(↓↓↓)
87
87
  ![fitting結果](6d3dd24db77dd208def011fc945d3226.png)

1

初心者マーク、説明の追加

2021/12/05 07:08

投稿

python_wakaran
python_wakaran

スコア13

title CHANGED
File without changes
body CHANGED
@@ -82,4 +82,6 @@
82
82
  center_x:0.01
83
83
  center_y:-0.42
84
84
  constant:304.8
85
+
86
+ fittingしたパラメータでグラフを作成した
85
87
  ![fitting結果](6d3dd24db77dd208def011fc945d3226.png)