Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

241 строка
7.6 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 создан
```
- Для первого бинарного файла:
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
![График](Figure_1_t.png)
![График](Figure_2_t.png)