質問編集履歴

1

最大値がy=100であることが判明したので,y=50の時のxの値を求めたいです。

2020/11/19 08:44

投稿

ryokkun0331
ryokkun0331

スコア2

test CHANGED
File without changes
test CHANGED
@@ -2,14 +2,16 @@
2
2
 
3
3
  ガウス型パルスの半値全幅を求めたい。
4
4
 
5
-
6
-
7
5
  もしくは、ガウス型パルス(作成した波形)の最大値の値の半分(半値)を求め
8
6
 
9
7
  ガウスパルス状のその半値同士の幅を求めたい
10
8
 
11
9
 
12
10
 
11
+ **最大値がy=100であることが判明したので,y=50の時のxの値を求めたいです。**
12
+
13
+
14
+
13
15
  求めたい波形→ft0(データ数128個の配列)
14
16
 
15
17
 
@@ -68,6 +70,430 @@
68
70
 
69
71
 
70
72
 
73
+
74
+
75
+ #本来のプログラム
76
+
77
+ import numpy as np
78
+
79
+ import math
80
+
81
+ import matplotlib.pyplot as plt
82
+
83
+ #範囲狭める、要素から攻める .フーリエするやつ
84
+
85
+ #定数宣言・パラメータ
86
+
87
+ a = np.arange(-100.0e-12,150.0e-12,1.0e-12) #500.0e-12~600.0e-12の時間t(要素1100個)
88
+
89
+ a2 = np.arange(1,199,1) #1~1000の整数(kの一行に要素が3つある行の代入に使用)
90
+
91
+ a3 = np.arange(-99.0e-12,101.0e-12,1.0e-12) #-500.0e-12~500.0e-12の時間t(要素1001個)
92
+
93
+ a4 = np.arange(0,1000.0e-12,1.0e-12)#グラフ用の時間t
94
+
95
+ k = np.eye(200) #kの土台(単位行列(1001×1001))
96
+
97
+ A = 100
98
+
99
+ B = 217.0e-28
100
+
101
+ z = 30.0e+3 #伝搬距離
102
+
103
+ T = 18016836.0e-18#パルス幅(30ps)
104
+
105
+ dz = 10000#差分近似用Δz
106
+
107
+
108
+
109
+ #p(t,z)の作成0
110
+
111
+ p = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * z ,2)) * np.exp((-1 * pow(T* a ,2))/(pow(T ,4)+pow(B * z ,2)))
112
+
113
+ #p(t,z)の(a3サイズ)の作成
114
+
115
+ pa3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * z ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * z ,2)))
116
+
117
+ #p1a3(t+dz)差分近似用の作成
118
+
119
+ p1a3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * (z + dz) ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * (z + dz) ,2)))
120
+
121
+ #p2a3(t-dz)差分近似用の作成
122
+
123
+ p2a3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * (z - dz) ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * (z - dz) ,2)))
124
+
125
+ #dp/dzの作成
126
+
127
+ dpdz = pow(A * T * B ,2) * z * ((2 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * z ,2)) - 1) * pow(pow(T ,4)
128
+
129
+ + pow(B * z ,2) , -1.5) * np.exp(-1 * pow(T* a3 ,2)/(pow(T ,4) + pow(B * z ,2)))
130
+
131
+
132
+
133
+ pp = (p1a3 - pa3) / dz #前進差分の作成
134
+
135
+ pp2 = (p1a3 - p2a3) /2 /dz #中心差分の作成
136
+
137
+
138
+
139
+ ##f(t,0)のフーリエft0f 分散 逆フーリエft0if
140
+
141
+ #元の式f(t,0)
142
+
143
+ ft0 = A * np.exp(pow(a3[35:163]/T,2)/(-2))
144
+
145
+ ft300 = (A*T/np.sqrt(T**2-(1j*B*z))) * np.exp((-(T*a3[35:163])**2) / ((2 * T**4) + (2 * (B*z)**2))) * np.exp((-1j * B * z * a3[35:163]**2)/ ((2 * T**4) + (2 * (B*z)**2)))
146
+
147
+
148
+
149
+
150
+
151
+ #フーリエ変換
152
+
153
+ ft0f = np.fft.fft(ft0)
154
+
155
+
156
+
157
+ #分散用パラメータ
158
+
159
+ N = 128#データ数(128=2^7)
160
+
161
+ RATE = 42.44**12 #周波数(1ビットの時間幅)
162
+
163
+ Th = 1/RATE #ビット速度(時間幅の逆数)
164
+
165
+ dt = Th / 32 # サンプル点間隔
166
+
167
+ s = dt * N # 1周期時間[s]
168
+
169
+ f = 1/s # 1周期[Hz]
170
+
171
+ #分散式
172
+
173
+ ome = 0
174
+
175
+ dome = 2*np.pi*f
176
+
177
+ ft0fb = np.zeros(N, dtype=np.complex128) #分散信号
178
+
179
+
180
+
181
+ for a in range(N):
182
+
183
+ ft0fb[a] = ft0f[a] * np.exp(1j*B*(ome**2)*z/2)
184
+
185
+ ome = ome + dome
186
+
187
+ if a == N/2 -1:
188
+
189
+ ome = -ome
190
+
191
+
192
+
193
+ #逆フーリエ変換
194
+
195
+ ft0if = np.fft.ifft(ft0fb)
196
+
197
+ ft0if = ft0if.real
198
+
199
+
200
+
201
+
202
+
203
+ plt.figure(0)
204
+
205
+ plt.title("f(t,0)基本",fontname="MS Gothic")
206
+
207
+ plt.xlabel("t")
208
+
209
+ plt.ylabel("f(t,0)",fontname="MS Gothic")
210
+
211
+ plt.plot(a3[35:163],ft0)
212
+
213
+
214
+
215
+ plt.figure(1)
216
+
217
+ plt.title("周波数領域",fontname="MS Gothic")
218
+
219
+ plt.xlabel("t")
220
+
221
+ plt.ylabel("フーリエ変換後",fontname="MS Gothic")
222
+
223
+ plt.plot(a3[35:163],ft0f)
224
+
225
+ plt.plot(a3[35:163],ft0fb)
226
+
227
+
228
+
229
+ plt.figure("z=30km")
230
+
231
+ plt.title("時間領域")
232
+
233
+ plt.xlabel("t")
234
+
235
+ plt.ylabel("青:f(t,30) オレンジ:分散処理後",fontname="MS Gothic")
236
+
237
+ #plt.plot(a3[35:163],ft0)
238
+
239
+ plt.plot(a3[35:163],ft300)
240
+
241
+ plt.plot(a3[35:163],ft0if)
242
+
243
+
244
+
245
+ plt.show()
246
+
247
+
248
+
249
+
250
+
251
+ #dp/dzの行列を縦一列に変形
252
+
253
+ dpdz = dpdz[:200].reshape([200,1])
254
+
255
+ pp = pp[:200].reshape([200,1])
256
+
257
+ pp2 = pp2[:200].reshape([200,1])
258
+
259
+
260
+
261
+
262
+
263
+ #k(単位行列(1001×1001))の2~1000行にpを繰り返し代入 ※一行に要素が3つある行
264
+
265
+ for i in a2:
266
+
267
+ k[i][i-1] = p[i+1] + p[i+2]
268
+
269
+ k[i][i] = -(p[i+1] + 2*p[i+2] + p[i+3])
270
+
271
+ k[i][i+1] =p[i+2] + p[i+3]
272
+
273
+
274
+
275
+ #kの1行目と1001行目にpを代入 ※一行に要素が2つある行
276
+
277
+ k[199][199] = -(p[200] + 2*p[201] + p[202])
278
+
279
+ k[199][198] = p[200] + p[201]
280
+
281
+ k[0][0] = -(p[1] + 2*p[2] + p[3])
282
+
283
+ k[0][1] = p[2] + p[3]
284
+
285
+
286
+
287
+
288
+
289
+ kin = np.linalg.inv(k) #kの逆行列kin
290
+
291
+
292
+
293
+ b = dpdz #作成とb(dpdz)の作成
294
+
295
+ b2 = pp #b2(前進差分)
296
+
297
+ b3 = pp2 #b3(中心差分)
298
+
299
+
300
+
301
+ #各配列にどれだけ要素が入っているかの確認用(shape)
302
+
303
+ """
304
+
305
+ print("a")
306
+
307
+ print(a.shape)
308
+
309
+ print("a2")
310
+
311
+ print(a2.shape)
312
+
313
+ print("a3")
314
+
315
+ print(a3.shape)
316
+
317
+ print(k.shape)
318
+
319
+ print("p")
320
+
321
+ print(p.shape)
322
+
323
+ print("dpdz")
324
+
325
+ print(dpdz.shape)
326
+
327
+ print("kin")
328
+
329
+ print(kin.shape)
330
+
331
+ """
332
+
333
+
334
+
335
+ #各行列の確認用(shape)
336
+
337
+ np.set_printoptions(linewidth=2000,edgeitems=7,precision=4, floatmode='maxprec')
338
+
339
+ """
340
+
341
+ print("k")
342
+
343
+ print(k)
344
+
345
+ print("a")
346
+
347
+ print(a)
348
+
349
+ print("a2")
350
+
351
+ print(a3)
352
+
353
+
354
+
355
+ print("dpdz")
356
+
357
+ print(dpdz)
358
+
359
+ print("b")
360
+
361
+ print(b)
362
+
363
+ """
364
+
365
+ print("b")
366
+
367
+ print(b)
368
+
369
+ print("b2")
370
+
371
+ print(b2)
372
+
373
+ print("b3")
374
+
375
+ print(b3)
376
+
377
+
378
+
379
+ #3.13式よりφを計算
380
+
381
+ iso0 = kin @ b #iso0 b=dpdz
382
+
383
+ iso0 = iso0.reshape([200,])
384
+
385
+ print("iso0")
386
+
387
+ print(iso0.shape)
388
+
389
+ print(iso0)
390
+
391
+
392
+
393
+ iso = kin @ b2#iso b=前進差分
394
+
395
+ iso = iso.reshape([200,])
396
+
397
+ print("iso")
398
+
399
+ print(iso.shape)
400
+
401
+ print(iso)
402
+
403
+
404
+
405
+ iso2 = kin @ b3#iso2 b=中心差分
406
+
407
+ iso2 = iso2.reshape([200,])
408
+
409
+ print("iso2")
410
+
411
+ print(iso2.shape)
412
+
413
+ print(iso2)
414
+
415
+
416
+
417
+ #各行列のPLOt
418
+
419
+ """
420
+
421
+ plt.figure(4)
422
+
423
+ plt.xlabel("t")
424
+
425
+ plt.ylabel("p(t,z)")
426
+
427
+ plt.plot(a3,p[:200])
428
+
429
+
430
+
431
+ plt.figure(5)
432
+
433
+ plt.xlabel("t")
434
+
435
+ plt.ylabel("bとpp")
436
+
437
+ plt.plot(a3,dpdz)
438
+
439
+ plt.plot(a3,pp)
440
+
441
+ plt.plot(a3,pp2)
442
+
443
+
444
+
445
+ plt.figure(6)
446
+
447
+ plt.xlabel("t")
448
+
449
+ plt.ylabel("φ")
450
+
451
+ plt.plot(a3,iso0)
452
+
453
+ plt.plot(a3,iso)
454
+
455
+ plt.plot(a3,iso2)
456
+
457
+
458
+
459
+ ig = (-B * z * pow(a3,2))/(2 * pow(T,4) + 2 * pow(B * z,2))
460
+
461
+
462
+
463
+ plt.figure(7)
464
+
465
+ plt.xlabel("t")
466
+
467
+ plt.ylabel("位相変化厳密",fontname="MS Gothic")
468
+
469
+ plt.plot(a3,ig)
470
+
471
+
472
+
473
+ plt.figure(8)
474
+
475
+ plt.xlabel("t")
476
+
477
+ plt.ylabel("位相変化厳密",fontname="MS Gothic")
478
+
479
+ plt.plot(a3,iso0)
480
+
481
+ plt.plot(a3,iso)
482
+
483
+ plt.plot(a3,iso2)
484
+
485
+ plt.plot(a3,ig)
486
+
487
+
488
+
489
+ plt.show()
490
+
491
+ """
492
+
493
+
494
+
495
+
496
+
71
497
  ```
72
498
 
73
499