Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Используя код ниже найти максимальную и среднюю погрешность для интервала температур от 300 до 1400 кельвинов
- # Понимание решение второй части задачи из начала урока
- # Файл lambda_exp.txt с экспериментально полученными значениями находится в этой же папке
- # 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))
- # НАЧИНАЕМ ОБРЕЗАТЬ КАЖДЫЙ ИЗ СПИСКОВ
- # ОБРЕЖЕМ КАЖДЫЙ ИЗ СПИСКОВ ДЛЯ НАЧАЛА
- # Начнём с опеределения границ правильным способом
- t300 = int(t_list.index(300)) # номер значения температуры 300 кельвинов в списке
- t1400 = int(t_list.index(1400)) # номер значения температуры 300 кельвинов в списке
- #теперь обрезать этот список t_list с температурой, обрезанный список вывести максимальную и среднюю погрешность используя формулы выше# ограничим список теперь в пределах температур от 300 до 1400 Кельвинов
- t_list_slice = t_list[t300:t1400+1] # прибавим в конце 1, чтобы попало конечное число 1400 в список
- #print(t_list_slice, '- обрезанный список температур') - testok
- lambda_exp_list_slice = lambda_exp_list[t300:t1400]
- #print(lambda_exp_list_slice, '- обрезанный список экспериментальных значений') - testok
- error_list_slice = error_list[t300:t1400]
- #print(error_list_slice, '- обрезанный список погрешностей') - testok
- print()
- print()
- print()
- max_error_slice = max(error_list_slice) * 100 # верно получилось
- print('%4.2f' % max_error_slice, '- максимальный процент отклонения на обрезанном промежутке')
- avg_error_slice = (sum(error_list_slice) / len(error_list_slice))*100 # cумму каждого элемента разделим на количество
- print('%4.2f' % avg_error_slice, '- средний процент отклонений') # 10.09.20 - пока неверно. Почему?
- print()
- print()
- print()
- print()
- # Со следующей строки мусорный код, НУЖНО УДАЛИТЬ
- # Теперь нужно обрезать список экспериментальных теплопроводностей через цикл рассчитаем каждое соответсвующее значение и выведем на экран(необязательно но охота)
- print('-' * 45)
- print('| %1s | | %7s | %7s | %7s |%8s |' % ('№', 't', 'L(t)', 'Exp(t)', 'error'))
- print('-' * 45)
- # c 94 cтроки и ниже мусорный код, удалить
- for i in range(len(t_slice_list)):
- print('|%2d | %7d | %7.2f | %7d |%7.2f%% |' % (i+1, t_slice_list[i], lambda_list[i], lambda_exp_slice_list[i] - int(t_list.index(300)), error_list_slice[i] * 100)) # |%7.2f%% | - почему без ошибки обязательно нужно два знака процентов в конце форматного вывода
- #i+1 не добавляет значений, а Прибавляет цифру к текущему значению, чтобы был ровный счёт
- # если в форматном выводе мы пишем %8d или %8s, а число или строка состоит из меньшего количества знаков, то остальные знаки будут пробелами в начале или конце
- print('-' * 45)
- lambda_exp_slice_list = lambda_exp_list[int(t_list.index(300)): int(t_list.index(1400)+1)]
- # идеи: вывести полностью новый список с расчетом температур в промежутке от 300 до 1400 включительно
- # и продолжать работать с этим новым списком
- # но пока не понятно как это сделать быстрее и красивее
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement