форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
266 строки
8.4 KiB
Markdown
266 строки
8.4 KiB
Markdown
# Индивидуальное контрольное задание по теме 9
|
|
|
|
## Задание:
|
|
1) Создайте модуль М1, содержащий две функции:
|
|
- функция 1: аргументы - список или кортеж Х с элементами - отсчетами некоторого сигнала и числовой параметр Т; в функции создается новый список Х1 с элементами, значения которых определяются по значениям элементов из Х по правилу: X1[i]=T, если X[i]>T; X1[i]=-T, если X[i]<-T; в остальных случаях X1[i]=X[i];
|
|
- функция 2: аргумент - список или кортеж ХХ ; в функции должно подсчитываться число элементов, удовлетворяющих неравенству XX[i]>XX[i-1].
|
|
|
|
|
|
2) Создайте еще один модуль М2, в котором должны выполняться операции:
|
|
- запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса;
|
|
- из файла считывается список Х;
|
|
- запрашивается значение параметра Т с проверкой Т>0;
|
|
- с помощью функции 1 производится преобразование сигнала с записью его в новый список; отображается результат;
|
|
- с новому списку применяется функция 2 и отображается результат;
|
|
- преобразованный сигнал записывается в бинарный файл Res55.bin.
|
|
|
|
3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика исходный и преобразованный сигнал.
|
|
|
|
4) Для проверки программы создайте 2 текстовых файла: в первый запишите 40 отсчетов синусоидального сигнала с периодом 9 и амплитудой 3.5 ; во второй - случайный, нормально распределенный сигнал с математическим ожиданием, равным 5, и стандартным отклонением, равным 7. При запуске программы с первым файлом задайте Т=2.5, со вторым - Т=6.
|
|
|
|
## Решение:
|
|
- M1:
|
|
```
|
|
>>>def function_1(X, T):
|
|
X1 = []
|
|
for value in X:
|
|
if value > T:
|
|
X1.append(T)
|
|
elif value < -T:
|
|
X1.append(-T)
|
|
else:
|
|
X1.append(value)
|
|
return X1
|
|
|
|
>>>def function_2(XX):
|
|
count = 0
|
|
for i in range(1, len(XX)):
|
|
if XX[i] > XX[i-1]:
|
|
count += 1
|
|
return count
|
|
```
|
|
|
|
- M2:
|
|
```
|
|
>>>import M1
|
|
|
|
>>>def main():
|
|
print("=== Обработка сигнала ===")
|
|
while True:
|
|
filename = input("Введите имя файла: ")
|
|
try:
|
|
file = open(filename, 'r')
|
|
file.close()
|
|
break
|
|
except:
|
|
print(f"Файл '{filename}' не найден. Попробуйте еще.")
|
|
|
|
print(f"Чтение файла {filename}...")
|
|
X = []
|
|
file = open(filename, 'r')
|
|
for line in file:
|
|
try:
|
|
X.append(float(line.strip()))
|
|
except:
|
|
pass # пропускаем строки, которые не содержат чисел
|
|
file.close()
|
|
print(f"Прочитано чисел: {len(X)}")
|
|
print(f"Первые 3 числа: {X[:3]}")
|
|
|
|
while True:
|
|
try:
|
|
T = float(input("Введите T (>0): "))
|
|
if T > 0:
|
|
break
|
|
else:
|
|
print("T должен быть больше 0")
|
|
except:
|
|
print("Введите число")
|
|
|
|
# Применяем функцию 1
|
|
X1 = M1.function_1(X, T)
|
|
print(f"\nСигнал обработан с T={T}")
|
|
print(f"Пример: X[0]={X[0]:.3f} -> X1[0]={X1[0]:.3f}")
|
|
print(f" X[1]={X[1]:.3f} -> X1[1]={X1[1]:.3f}")
|
|
|
|
# Применяем функцию 2
|
|
increases = M1.function_2(X1)
|
|
print(f" Число элементов удовлетворяющих неравенству: {increases}")
|
|
|
|
# Сохраняем в файл
|
|
with open("Res55.bin", 'w') as f:
|
|
for value in X1:
|
|
f.write(f"{value}\n")
|
|
print("Файл Res55.bin создан")
|
|
return X, X1
|
|
```
|
|
|
|
- M0(основной):
|
|
```
|
|
>>>import M2
|
|
>>>import matplotlib.pyplot as plt
|
|
|
|
>>>def main():
|
|
original, processed = M2.main()
|
|
# Строим графики
|
|
plt.figure(figsize=(10, 6))
|
|
# График 1
|
|
plt.subplot(2, 1, 1)
|
|
plt.plot(original, 'b-')
|
|
plt.title("Исходный сигнал")
|
|
plt.xlabel("Номер отсчета")
|
|
plt.ylabel("Значение")
|
|
plt.grid(True)
|
|
|
|
# График 2
|
|
plt.subplot(2, 1, 2)
|
|
plt.plot(processed, 'r-')
|
|
plt.title("Обработанный сигнал")
|
|
plt.xlabel("Номер отсчета")
|
|
plt.ylabel("Значение")
|
|
plt.grid(True)
|
|
plt.tight_layout()
|
|
plt.show()
|
|
|
|
>>>if __name__ == "__main__":
|
|
main()
|
|
=== Обработка сигнала ===
|
|
Введите имя файла: sine.txt
|
|
Чтение файла sine.txt...
|
|
Прочитано чисел: 40
|
|
Первые 3 числа: [0.0, 2.249756633902887, 3.446827135542728]
|
|
Введите T (>0): 2.5
|
|
|
|
Сигнал обработан с T=2.5
|
|
Пример: X[0]=0.000 -> X1[0]=0.000
|
|
X[1]=2.250 -> X1[1]=2.250
|
|
Число элементов удовлетворяющих неравенству: 18
|
|
Файл Res55.bin создан
|
|
|
|
=== Обработка сигнала ===
|
|
Введите имя файла: normal.txt
|
|
Чтение файла normal.txt...
|
|
Прочитано чисел: 40
|
|
Первые 3 числа: [-12.419956992247982, 9.170966980707039, 1.5586943810492464]
|
|
Введите T (>0): 6
|
|
|
|
Сигнал обработан с T=6.0
|
|
Пример: X[0]=-12.420 -> X1[0]=-6.000
|
|
X[1]=9.171 -> X1[1]=6.000
|
|
Число элементов удовлетворяющих неравенству: 16
|
|
Файл Res55.bin создан
|
|
```
|
|
- Программа для создания файлов и проверки:
|
|
```
|
|
>>>import math
|
|
>>>import random
|
|
|
|
# Синусоидальный сигнал (40 точек)
|
|
>>>with open("sine.txt", "w") as f:
|
|
for i in range(40):
|
|
value = 3.5 * math.sin(2 * math.pi * i / 9)
|
|
f.write(f"{value}\n")
|
|
print("Файл sine.txt создан (синус)")
|
|
|
|
# Нормальный сигнал (40 точек)
|
|
>>>with open("normal.txt", "w") as f:
|
|
for i in range(40):
|
|
# Простой способ получить нормальное распределение
|
|
r = sum(random.random() for _ in range(12)) - 6
|
|
value = 5 + 7 * r
|
|
f.write(f"{value}\n")
|
|
print("Файл normal.txt создан (нормальный)")
|
|
|
|
>>>print(" sine.txt с T=2.5")
|
|
>>>print(" normal.txt с T=6")
|
|
>>>print("\nЗапуск: python M0.py")
|
|
```
|
|
- Для первого бинарного файла:
|
|
0.0
|
|
2.249756633902887
|
|
2.5
|
|
2.5
|
|
1.197070501639841
|
|
-1.1970705016398404
|
|
-2.5
|
|
-2.5
|
|
-2.2497566339028885
|
|
-8.572527594031472e-16
|
|
2.249756633902887
|
|
2.5
|
|
2.5
|
|
1.1970705016398404
|
|
-1.197070501639838
|
|
-2.5
|
|
-2.5
|
|
-2.2497566339028867
|
|
-1.7145055188062944e-15
|
|
2.2497566339028845
|
|
2.5
|
|
2.5
|
|
1.197070501639847
|
|
-1.1970705016398373
|
|
-2.5
|
|
-2.5
|
|
-2.249756633902887
|
|
-2.5717582782094417e-15
|
|
2.2497566339028836
|
|
2.5
|
|
2.5
|
|
1.197070501639842
|
|
-1.1970705016398364
|
|
-2.5
|
|
-2.5
|
|
-2.249756633902888
|
|
-3.429011037612589e-15
|
|
2.2497566339028827
|
|
2.5
|
|
2.5
|
|
|
|
- Для второго файла:
|
|
-6.0
|
|
6.0
|
|
1.5586943810492464
|
|
2.4650468069822447
|
|
-1.3776515381877372
|
|
4.308588576336187
|
|
-2.477643780693926
|
|
3.1227006290467134
|
|
-6.0
|
|
1.4639685181290663
|
|
0.5887631397128779
|
|
2.047305681679859
|
|
6.0
|
|
6.0
|
|
5.523857430011989
|
|
-6.0
|
|
6.0
|
|
6.0
|
|
0.8873255790447026
|
|
6.0
|
|
4.186677532259668
|
|
6.0
|
|
3.9062331720166252
|
|
6.0
|
|
6.0
|
|
6.0
|
|
3.4689403335145297
|
|
6.0
|
|
6.0
|
|
6.0
|
|
4.336774118550339
|
|
3.9036252545111303
|
|
6.0
|
|
3.160901927152815
|
|
5.7645792486392
|
|
6.0
|
|
0.342439825635517
|
|
0.7388797780425458
|
|
-1.4449795545346191
|
|
-2.913183927457421
|
|
|
|
|
|

|
|
|
|

|