Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Понимание решение третьей и второй части задачи из начала урока
- # Файл lambda_exp.txt с экспериментально полученными значениями находится в этой же папке
- import matplotlib.pyplot as plt
- # 1. Напишем функцию формулы расчета теплопроводсти
- def compute_lambda(t):
- b = 33 # константа, выведенная экспериментальным путём
- l_0 = 884 # теплопроводность кремния при 100 К
- t_0 = 100 # температура равная 100 К
- y = b * (l_0 / (t - t_0))
- return y
- # 2. Откроем файл для чтения, кодировку можно не указывать, т.к. там только числа
- f = open('lambda_exp.txt', 'r')
- # 3. Cоздаем пустые списки для значений температур и теплопроводности:
- t_list = [] # пустой спискок значений температур
- lambda_exp_list = [] # пустой спискок значений теплопроводности
- # 5. Последовательно считываем строки файла.
- # Из каждой строки (числа в ней разделены пробелом) создать список t_lambda_list, состоящий из двух элементов с помощью функции split()
- # (Исходная строка 200 264, t_lambda_list = ['200', '264'])
- # Первый элемент списка t_lambda_list добавить к списку температур, второй - к списку тепловодности
- # преобразовав строковое значение к вещественному float
- for line in f:
- t_lambda_list = line.split() # разобьём каждую строку на строковые значения списка
- t_list.append(float(t_lambda_list[0])) #создадим список температур из первого столбика, т.е. первых значений каждой строки
- lambda_exp_list.append(float(t_lambda_list[1])) #создадим список теплопроводности из второго столбика, т.е. вторых значений каждой строки
- f.close() # 5. Закроем файл
- #print(t_list, 'temp') - для предварительного теста программы, работает!
- #print(lambda_list, 'thermal conductivity')
- # 6. Cформировать список со значениями теплопроводности, посчитанными с помощью функции compute_lambda(t) для температур из списка t_list
- lambda_list = [compute_lambda(t) for t in t_list] # cписок посчитанных по формул значений теплопроводности
- #print(lambda_list, 'thermal conductivity')
- # 7. Найдём отностельную погрешность вычисления теплопроводности для каждого значения температуры.
- # Для этого формула вычисления погрешности применяется к соответсвущим элементам списков lambda_list и lambda_exp_list.
- # В резултате создаем новый список error_list.
- error_list = [abs((lambda_exp_list[i] - lambda_list[i]) / lambda_exp_list[i]) for i in range(len(t_list))] # abs - модуль значения, т.к. процент не может быть отрицательным
- #print(error_list)
- # 8. Сформировать таблицу вывода значений температур, экспериментально полученной теплопроводности,
- # расчитанной по формуле теплопроводности и погрешности вычислений...
- print('-' * 45)
- print('| %1s | | %7s | %7s | %7s |%8s |' % ('№', 't', 'L(t)', 'Exp(t)', 'error'))
- print('-' * 45)
- for i in range(len(t_list)):
- print('|%2d | %7d | %7.2f | %7d |%7.2f%% |' % (i+1, t_list[i], lambda_list[i], lambda_exp_list[i], error_list[i] * 100)) # |%7.2f%% | - почему без ошибки обязательно нужно два знака процентов в конце форматного вывода
- #i+1 не добавляет значений, а Прибавляет цифру к текущему значению, чтобы был ровный счёт
- # если в форматном выводе мы пишем %8d или %8s, а число или строка состоит из меньшего количества знаков, то остальные знаки будут пробелами в начале или конце
- print('-' * 45)
- # 9. Найдём максимальную погрешность для интервала температур от 300 до 1400
- # Обрежем список по-умному, т.е. чтобы программа сама перебором находила эти температуры и обрезала список
- max_error = max(error_list)
- # Найдём температуру, которой эта погрешность соответсвует
- # В Питоне реализованы различные методы работы со списками, в частности метод index(x),
- # который находит первый встретившийся элемент x и возвращает индекс этого элемента.
- # Например [5, 3, 6, 3].index(3) вернёт 1.
- # В нашем случае индекс максимального значения в списке погрешностей error_list можно найти с помощью оператора:
- index_max_error = error_list.index(max_error)
- #print(index_max_error+1) - testok
- # Вывести значение максимальной погрешности и соответсвующей ей температуры:
- print('Максимальная погрешность - %5.2f, при t = %3d, строка № %1d' % (max_error * 100, t_list[index_max_error], index_max_error+1)) #выведется один раз, хоть и второе в квадратных скобках [там просто число], т.к. это не в цикле for
- # Аналогично вычислим минимальную погрешность
- min_error = min(error_list) #значение минимальной погрешности из списка
- #print(min_error*100)
- index_min_error = error_list.index(min_error) # индекс(номер по счету первый попавшийся) этого минимального числа в списке error_list
- #print(index_min_error+1) - testok
- print('Минимальная погрешность - %5.2f, при t = %3d в строке номер %1d' % (min_error * 100, t_list[index_min_error], index_min_error+1))
- # 11. Найдём среднюю погрешность:
- avg_error = sum(error_list) / len(error_list) # cумму каждого элемента разделим на количество 15
- print('Cредняя погрешность = %5.2f%%' % (avg_error * 100))
- # НАЧАЛО ПОСТРОЙКИ ГРАФИКА ИЗ ЗАДАНИЯ 2.3.9
- # 12. Cоздадим линии для отображения экспериментальных и теоритических значений теплопроводности
- # Зададим им форматирование.
- line_th = plt.plot(t_list, lambda_list, label = 'теоритические')
- line_exp = plt.plot(t_list, lambda_exp_list, label = 'экспериментальные')
- #задаём стиль для линий
- plt.setp(line_exp, color = 'blue', linestyle = '--', linewidth = 2)
- plt.setp(line_th, color = 'red', linewidth = 2)
- # 13. Вывести легенду, изменить положение осей, скрыть две из них, вывести заголовок и отобразить графики:
- plt.legend() # надпись с описаним графиков
- plt.gca().spines["left"].set_position("zero")
- # plt.gca().spines["bottom"].set_positon("zero")
- plt.gca().spines["top"].set_visible(False)
- plt.gca().spines["right"].set_visible(False)
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement