форкнуто от main/python-labs
Родитель
6b7c3029d8
Сommit
379bfb83e1
|
После Ширина: | Высота: | Размер: 58 KiB |
|
После Ширина: | Высота: | Размер: 63 KiB |
@ -0,0 +1,27 @@
|
||||
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()
|
||||
@ -0,0 +1,17 @@
|
||||
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
|
||||
@ -0,0 +1,52 @@
|
||||
|
||||
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
|
||||
@ -0,0 +1,22 @@
|
||||
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 +1,240 @@
|
||||
# Индивидуальное контрольное задание по теме 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
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
Загрузка…
Ссылка в новой задаче