Я думаю, вы пытаетесь сделать слишком много. У Django есть поддержка этого, он даже имеет большую поддержку при рендеринге списков и обеспечивает, чтобы пользователь вошел в систему.
Мы можем использовать класс на основе для этого : a ListView
:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
class PostListView(LoginRequiredMixin, ListView):
model = Post
template_name = 'dashboard/postlist.html'
paginate_by = 5
queryset = Post.objects.order_by('-date')
В вашем шаблоне dashboard/postlist.html
вы можете добавить логику для отображения кнопок. Например,
<!-- render the list -->
{% if is_paginated %}
{% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
{% endif %}
{% endif %}
В urls.py
вы можете использовать PostListView.as_view()
вместо PostLists
. Таким образом, ListView
будет обрабатывать проверку подлинности, нарезку, разбиение на страницы и т. Д.
Событие, которое вы должны искать, - это когда первая производная v
меняет знак. Для максимума проверьте, не отрицательна ли вторая производная a
.
yp, y = y, euler(y,dydt,h)
if py[1]*y[1] < 0 and y[2] < 0:
# do what you need to do to list the maximum
Вы можете использовать линейную интерполяцию, чтобы получить более точную ординату для максимальной позиции.
Если вы хотите получить серьезные результаты, используйте метод более высокого порядка для интеграции с ODE.
Я бы предложил использовать find_peaks из модуля scipy.signal
. Эта функция принимает одномерный массив и находит все локальные максимумы путем простого сравнения соседних значений. Необязательно, подмножество этих пиков может быть выбрано путем указания условий для свойств пика.
Вот фрагмент кода, с которого можно начать:
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import find_peaks
Fs = 8000
f = 5
sample = 8000
x = np.arange(sample)
y = np.sin(2 * np.pi * f * x / Fs)
peaks = find_peaks(y)
plt.scatter(peaks[0], np.ones(f), c='red')
plt.plot(x, y)
plt.xlabel('sample(n)')
plt.ylabel('voltage(V)')
plt.show()
Ваши максимумы:
print(peaks[0])
[ 400 2000 3600 5200 6800]