Скачиваний:
11
Добавлен:
05.02.2020
Размер:
3.1 Кб
Скачать
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import jv
from scipy.constants import c
from scipy.optimize import bisect


def get_depence_vs_from_ws(Rw, e, n=0):
    def f(v, w, n):
        return jv(n, Rw * w / c * (e - 1 / v ** 2) ** .5)

    ws = np.array([2 *np.pi * (5 + 20 * i / 100) * 1e9 for i in range(100)])
    v_step = 1e-4
    v_prev = v = 2
    f1s_and_vfs = []

    for w in ws:
        f_of_v_prev = f_of_v = f(v_prev, w, n)
        while f_of_v_prev * f_of_v > 0:
            v -= v_step
            f_of_v = f(v, w, n)
        f1s_and_vfs += [(w / 2 / np.pi / 1e9, bisect(f=f, a=v_prev, b=v, args=(w, n)))]
        v -= v_step
        v_prev = v

    f1s, vfs = zip(*f1s_and_vfs)

    plt.plot(f1s, vfs, 'red')
    plt.savefig('1.png')
    plt.close()

    return f1s, vfs


def sin_x(x): return 1 if x == 0 else np.sin(x) / x


def fun_spectrum(f): return sin_x((f - f0) * np.pi * dt1) * dt1


def get_signal(t, z): return sum([spectrum2s[k] * np.cos(fs[k] * 2 * np.pi * t - fs[k] * 2 * np.pi / function_vf(fs[k]) / c * 1e9 * z) if fgr < fs[k] < f1s[99] else 0 for k in range(n1)])


if __name__ == '__main__':
    Rw = 0.9
    e = 5.7
    f1s, vfs = get_depence_vs_from_ws(Rw, e, 0)
    fgr = f1s[0]
    function_vf = np.poly1d(np.polyfit(f1s, vfs, 15))
    ffs = np.arange(f1s[0], f1s[99], 1e-4)
    vffs = np.array([function_vf(ff) for ff in ffs])
    plt.plot(ffs, vffs, color='blue')
    plt.savefig('2.png')
    plt.close()

    n = int(1e3)
    f0 = 15
    dt1 = .666
    dt2 = 1.333
    dt3 = 0.0666
    n1 = 60
    p = 0.5
    fs = [k / dt2 for k in range(n1)]
    spectrum1s = [abs(fun_spectrum(fk)) for fk in fs]
    spectrum2s = [fun_spectrum(fk) for fk in fs]
    spectrum1s_max = max(spectrum1s) 
    spectrum2s_max = max(spectrum2s) 

    plt.plot(fs, [spectrum1 / spectrum1s_max for spectrum1 in spectrum1s], color='red')
    for j, spectrum2 in enumerate([abs(spectrum2 / spectrum2s_max) for spectrum2 in spectrum2s]):
        plt.plot([j / dt2] * 2, [0, spectrum2], color='blue')
        plt.scatter([j / dt2], [spectrum2], color='blue', s=10, marker='o')
    plt.plot([fgr] * 2, [0, 1], '--', color='red')
    plt.text(fgr, 1, 'fgr')
    plt.savefig('3.png')
    plt.close()

    plt.figure(figsize=(10, 2))
    times = [4 * dt2 * i / (n - 1) for i in range(n)]
    z = 0
    sign_outs = [get_signal(time - dt1 / 2, z) for time in times]
    number = 0
    time1 = 0
    dists = [number + i / n for i in range(n)]
    sign_out2s = [get_signal(time1 + dt1 / 2, dist) for dist in dists]

    res = 0
    for i in range(len(sign_out2s) - 1):
        if sign_out2s[i - 1] < p < sign_out2s[i]:
            res = sign_out2s[i]
    print(res)

    plt.figure(figsize=(10, 2))
    plt.plot(times, sign_outs, color='red')
    plt.savefig('4.png')
    plt.close()

    plt.figure(figsize=(10, 2))
    plt.plot(dists, sign_out2s, color='red')
    plt.plot([0, dists[-1]], [p] * 2, '--', color='blue')
    plt.savefig('5.png')
    plt.close()
Соседние файлы в папке lab5