Nano Hash - криптовалюты, майнинг, программирование

python-свертка с пошаговым откликом

Я хочу вычислить этот интеграл $\frac{1}{L}\int_{-\infty}^{t}H(t^{'})\exp(-\frac{R}{L}(t-t^{ '}))dt^{'}$ с использованием numpy.convolution, где $H(t)$ — функция heavside. Я должен получить это равным $\exp(-\frac{R}{L}t)H(t)$ ниже, это то, что я сделал, я изменил ограничение интеграла с -inf на +inf путем замены переменная, умножающая другую H (t), затем я использовал это как свою функцию для свертки с H (t) (тот, что внутри интеграла), но выходной график определенно не является функцией exp, и я не мог найти никаких ошибок в своем коде , пожалуйста, помогите, любые подсказки или предложения будут оценены!

import numpy as np
import matplotlib.pyplot as plt
R = 1e3 
L = 3. 

delta = 1
Nf = 100
Nw = 200
k = np.arange(0,Nw,delta)
dt = 0.1e-3 
tk = k*dt
Ng = Nf + Nw -2
n = np.arange(0,Nf+Nw-1,delta)
tn = n*dt

#define H
def H(n):
    H = np.ones(n)
    H[0] = 0.5
    return H

#build ftns that get convoluted
f = H(Nf)
w = np.exp((-R/L)*tk)*H(Nw)

#return the value of I
It = np.convolve(w,f)/L

#return the value of Voutput, b(t)
b = H(Ng+1) - R*It
plt.plot(tn,b,'o')
plt.show()
25.01.2015

  • эх, латекс не отображается, и я не могу добавить фотографии 25.01.2015
  • Я предполагаю, что вы пытаетесь определить реакцию напряжения резистора цепи RL на ступенчатый вход? Если вы извините за каламбур, ваш код выглядит немного... запутанным. 26.01.2015
  • О, я попытался взять только первую половину, и тогда это сработало (и я умножил это на dt, что я должен был сделать, поскольку np.convolve предполагает дельту t = 1, и это решило проблему единиц). однако я не знаю, почему мы берем только первую половину и работает (Python предполагает, что это может иметь какое-то отношение к граничным эффектам, но где мы решаем, где именно находится отсечка?) 29.01.2015
  • Я не понимаю, что вы имеете в виду, когда говорите только о первой половине и работаете. Взгляните на мой код и попытайтесь понять график. 29.01.2015

Ответы:


1

Проблема с вашим кодом не столько в программировании, сколько в концептуальности. Перепишите свертку как Integral[HeavisideTheta[t-t']*Exp[-R/L * t'], -Inf, t] (это код Mathematica), и после проверки вы обнаружите, что H(t-t') всегда 1 в пределах (за исключением t'=t, который является пределом интегрирования... но это не важно). Так что на самом деле вы на самом деле не выполняете полную свертка... вы просто берете половину (или треть) свертки.

Если вы думаете о свертке как об инвертировании одной последовательности, а затем переходе на одну смену и сложении всего этого (см. http://en.wikipedia.org/wiki/Convolution#Derivations - визуальное объяснение свертки), то вам нужна средняя половина... т.е. только когда они перекрываются. Вам не нужен ввод (4-й график вниз: http://en.wikipedia.org/wiki/File:Convolution3.svg). Вы хотите вывод.

Теперь самый простой способ исправить ваш код:

#build ftns that get convoluted
f = H(Nf)
w = np.exp((-R/L)*tk)*H(Nw)

#return the value of I
It = np.convolve(w,f)/L
max_ind = np.argmax(It)
print max_ind
It1 = It[max_ind:]

Вводная часть — это единственный момент, когда интеграл свертки (технически сумма в нашем случае) увеличивается... таким образом, после завершения вводной части интеграл свертки следует за Exp[-x]... так что вы указываете python только принимать значений после достижения максимума.

#return the value of Voutput, b(t) теперь работает отлично!

Примечание. Поскольку вам нужен вывод, вы не можете использовать np.convolve(a,b, mode = 'valid').

Итак, It1 выглядит так: It1

b(t) с использованием It1 выглядит так: введите здесь описание изображения

Вы никак не можете получить exp(-x) как общую форму, потому что уравнение для b(t) задается как 1 - R*exp(-x)... Оно не может математически следовать exp(- х) форма. На данный момент есть 3 вещи:

  1. Единицы на самом деле не имеют смысла... проверьте их. Функция Хевисайда равна 1, а R*It1 составляет около 10 000. Я не уверен, что это проблема, но на всякий случай нормализованная кривая выглядит так: normalized

  2. Вы можете получить форму exp(-x), если используете b(t) = R*It1 - H(t)... код для этого здесь (возможно, вам придется нормализовать в зависимости от ваших потребностей):

    b = R*It1 - H(len(It1))
    # print len(tn)
    plt.plot(tn[:len(b)], b,'o')
    plt.show()
    

А сюжет выглядит так: exponential

  1. Возможно, ваш вопрос все еще не решен, и в этом случае вам нужно объяснить, что именно вы считаете неправильным. С информацией, которую вы мне дали ... b (t) никогда не может иметь форму Exp [-x], если только уравнение для b (t) не испорчено. В исходном коде It1 следует за Exp[-x] по форме, но b(t) не может.
25.01.2015
  • Извините, я не совсем понимаю. Что вы имеете в виду под вводной частью? Разве код не считает только перекрывающуюся часть? Я использовал ваш метод, но график b(t) по-прежнему не равен exp(-Rt/L), как он и должен был выглядеть (мой график теперь кажется перевернутым) 26.01.2015
  • Свертка по своей сути имеет дело не только со случаями, когда есть чистое перекрытие. Он также имеет дело с такими случаями, как (4-й график вниз: en.wikipedia.org/ wiki/Файл:Convolution3.svg). Обратите внимание, что красная кривая не полностью находится внутри синей кривой... Таким образом, первые несколько членов свертки относятся к таким случаям... когда... две кривые не полностью перекрываются. Я называю это вводом, но по сути это только первые несколько членов свертки. 26.01.2015
  • Проблема связана с реакцией цепи RL. резистор R и катушка индуктивности L соединены последовательно, мы применяем напряжение H (t) к паре последовательно (входное напряжение), и нам нужно найти b (t), которое является напряжением только на катушке индуктивности. И интеграл, о котором я упоминал в начале, пришел из процесса вывода, у меня уже есть результат b(t) = exp(-Rt/L)H(t), просто решив дифференциальное уравнение, поэтому, если график из Python не например, exp(-x), то я, должно быть, неправильно выполнил свертку в python. Спасибо, теперь я понял, что означает вступление, но разве это не должно учитываться в свертке? 27.01.2015
  • Я не думаю, что ответ должен быть экспоненциально убывающим, просто основанным на физических рассуждениях. Если вы прикладываете ступенчатое напряжение от 0 до 1 В, то установившееся напряжение на резисторе должно быть равно этому напряжению, 1 В, после исчезновения переходных эффектов. Я думаю, что у вас может быть ошибка в вашей интеграции, и это, скорее всего, будет решение 1-exp(-x). 27.01.2015

  • 2

    Я думаю, что здесь есть небольшая путаница со сверткой. Мы используем свертку во временной области, чтобы вычислить реакцию линейной системы на произвольные входные данные. Для этого нам нужно знать импульсную характеристику системы. Будьте осторожны при переключении между непрерывной и дискретной системами - см., например, http://en.wikipedia.org/wiki/Impulse_invariance.

    Импульсную характеристику (непрерывную) вашей системы (которую я предполагаю для напряжения резистора цепи LR) я определил для удобства как функцию времени t: IR = lambda t: (R/L)*np.exp(-(R/L)*t) * H.

    Я также предположил, что ваши входные данные представляют собой ступенчатую функцию Хевисайда, которую я определил на временном интервале [0, 1] для временного шага 0,001 с.

    Когда мы сворачиваем (дискретно), мы эффективно переворачиваем одну функцию и сдвигаем ее вдоль другой, умножая соответствующие значения и затем беря сумму. Чтобы использовать непрерывную импульсную характеристику со ступенчатой ​​функцией, которая фактически состоит из последовательности дельта-функций Дирака, нам нужно умножить непрерывную импульсную характеристику на временной шаг dt, как описано в ссылке Википедии выше об импульсной инвариантности. NB - настройка H[0] = 0.5 также важна.

    Мы можем визуализировать эту операцию ниже. Любой заданный красный маркер представляет отклик в данный момент времени t и является «суммовым произведением» зеленого входа и перевернутой импульсной характеристики, сдвинутой вправо на t. Я попытался показать это с помощью нескольких серых импульсных откликов. введите здесь описание изображения

    Код для расчета находится здесь.

    import numpy as np
    import matplotlib.pyplot as plt
    
    R = 1e3     # Resistance
    L = 3.      #Inductance
    dt = 0.001  # Millisecond timestep
    
    # Define interval 1 second long, interval dt
    t = np.arange(0, 1, dt)
    
    # Define step function
    H = np.ones_like(t)
    H[0] = 0.5              # Correction for impulse invariance (cf http://en.wikipedia.org/wiki/Impulse_invariance)
    
    # RL circuit - resistor voltage impulse response (cf http://en.wikipedia.org/wiki/RL_circuit)
    IR = lambda t: (R/L)*np.exp(-(R/L)*t) * H # Don't really need to multiply by H as w is zero for t < 0
    # Response of resistor voltage
    response = np.convolve(H, IR(t)*dt, 'full')
    

    Дополнительный код для создания сюжета находится здесь:

    # Define new, longer, time array for plotting response - must be same length as response, with step dt
    tp = np.arange(len(response))* dt
    
    plt.plot(0-t, IR(t), '-', label='Impulse response (flipped)')
    
    for q in np.arange(0.01, 0.1, 0.01):
        plt.plot(q-t, IR(t), 'o-', markersize=3, color=str(10*q))
    t  = np.arange(-1, 1, dt)
    H = np.ones_like(t)
    H[t<0] = 0.
    plt.plot(t, H, 's', label='Unit step function')
    plt.plot(tp, response, '-o', label='Response')
    plt.tight_layout()
    plt.grid()
    plt.xlabel('Time (s)')
    plt.ylabel('Voltage (V)')
    plt.legend()
    plt.show()
    

    Наконец, если у вас все еще есть некоторая путаница в отношении свертки, я настоятельно рекомендую «Цифровая обработка сигналов: практическое руководство для инженеров и ученых» Стивена В. Смита.

    26.01.2015
  • спасибо за первый ответ. Вы правы, это проблема отклика цепи RL. Входное напряжение H(t) — это напряжение на последовательно соединенных парах R и L, а переходная характеристика b(t) (выходное напряжение) — это напряжение только на катушке индуктивности. 27.01.2015
  • Собственно, перечитав ваш комментарий, вы хотите напряжение на дросселе. Если вы посмотрите страницу Википедии, импульсная характеристика напряжения индуктора представляет собой дельта-функцию Дирака за вычетом использованной вами импульсной характеристики. Исправьте это, и вы получите ожидаемую экспоненту с затуханием. 27.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..