Advertisement
Vitaliy_Novichikhin

2.3.8half_wright_trashy_code_from_2.3.7

Sep 10th, 2020 (edited)
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.29 KB | None | 0 0
  1. # Используя код ниже найти максимальную и среднюю погрешность для интервала температур от 300 до 1400 кельвинов
  2. # Понимание решение второй части задачи из начала урока
  3. # Файл lambda_exp.txt с экспериментально полученными значениями находится в этой же папке
  4. # 1. Напишем функцию формулы расчета теплопроводсти
  5. def compute_lambda(t):
  6.     b = 33 # константа, выведенная экспериментальным путём
  7.     l_0 = 884 # теплопроводность кремния при 100 К
  8.     t_0 = 100 # температура равная 100 К
  9.     y = b * (l_0 / (t - t_0))
  10.     return y
  11.  
  12. # 2. Откроем файл для чтения, кодировку можно не указывать, т.к. там только числа
  13. f = open('lambda_exp.txt', 'r')
  14.  
  15. # 3. Cоздаем пустые списки для значений температур и теплопроводности:
  16.  
  17. t_list = [] # пустой спискок значений температур
  18. lambda_exp_list = [] # пустой спискок значений теплопроводности
  19.  
  20. # 5. Последовательно считываем строки файла.
  21. # Из каждой строки (числа в ней разделены пробелом) создать список t_lambda_list, состоящий из двух элементов с помощью функции split()
  22. # (Исходная строка 200 264, t_lambda_list = ['200', '264'])
  23. # Первый элемент списка t_lambda_list добавить к списку температур, второй - к списку тепловодности
  24. # преобразовав строковое значение к вещественному float
  25. for line in f:
  26.     t_lambda_list = line.split() # разобьём каждую строку на строковые значения списка
  27.     t_list.append(float(t_lambda_list[0])) #создадим список температур из первого столбика, т.е. первых значений каждой строки
  28.     lambda_exp_list.append(float(t_lambda_list[1])) #создадим список теплопроводности из второго  столбика, т.е. вторых значений каждой строки
  29.  
  30. f.close() # 5. Закроем файл
  31. #print(t_list, 'temp') - для предварительного теста программы, работает!
  32. #print(lambda_list, 'thermal conductivity')
  33.  
  34.  
  35.  
  36. # 6. Cформировать список со значениями теплопроводности, посчитанными с помощью функции compute_lambda(t) для температур из списка t_list
  37. lambda_list = [compute_lambda(t) for t in t_list] # cписок посчитанных по формул значений теплопроводности
  38. #print(lambda_list, 'thermal conductivity')
  39.  
  40. # 7. Найдём отностельную погрешность вычисления теплопроводности для каждого значения температуры.
  41. # Для этого формула вычисления погрешности применяется к соответсвущим элементам списков lambda_list и lambda_exp_list.
  42. # В резултате создаем новый список error_list.
  43. error_list = [abs((lambda_exp_list[i] - lambda_list[i]) / lambda_exp_list[i]) for i in range(len(t_list))] # abs - модуль значения, т.к. процент не может быть отрицательным
  44. #print(error_list)
  45.  
  46. # 8. Сформировать таблицу вывода значений температур, экспериментально полученной теплопроводности,
  47. # расчитанной по формуле теплопроводности и погрешности вычислений...
  48. print('-' * 45)
  49. print('| %1s | | %7s | %7s | %7s |%8s |' % ('№', 't', 'L(t)', 'Exp(t)', 'error'))
  50. print('-' * 45)
  51. for i in range(len(t_list)):
  52.     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%% | - почему без ошибки обязательно нужно два знака процентов в конце форматного вывода
  53.     #i+1 не добавляет значений, а Прибавляет цифру к текущему значению, чтобы был ровный счёт
  54.     # если в форматном выводе мы пишем %8d или %8s, а число или строка состоит из меньшего количества знаков, то остальные знаки будут пробелами в начале или конце
  55. print('-' * 45)
  56.  
  57.  
  58. # 9. Найдём максимальную погрешность для интервала температур от 300 до 1400
  59. # Обрежем список по-умному, т.е. чтобы программа сама перебором находила эти температуры и обрезала список
  60. max_error = max(error_list)
  61. # Найдём температуру, которой эта погрешность соответсвует
  62. # В Питоне реализованы различные методы работы со списками, в частности метод index(x),
  63. # который находит первый встретившийся элемент x и возвращает индекс этого элемента.
  64. # Например [5, 3, 6, 3].index(3) вернёт 1.
  65. # В нашем случае индекс максимального значения в списке погрешностей error_list можно найти с помощью оператора:
  66. index_max_error = error_list.index(max_error)
  67. #print(index_max_error+1) - testok
  68. # Вывести значение максимальной погрешности и соответсвующей ей температуры:
  69. print('Максимальная погрешность - %5.2f, при t = %3d, строка № %1d' % (max_error * 100, t_list[index_max_error], index_max_error+1)) #выведется один раз, хоть и второе в квадратных скобках [там просто число], т.к. это не в цикле for
  70. # Аналогично вычислим минимальную погрешность
  71. min_error = min(error_list) #значение минимальной погрешности из списка
  72. #print(min_error*100)
  73. index_min_error = error_list.index(min_error) # индекс(номер по счету первый попавшийся) этого минимального числа в списке error_list
  74. #print(index_min_error+1) - testok
  75. print('Минимальная погрешность - %5.2f, при t = %3d в строке номер %1d' % (min_error * 100, t_list[index_min_error], index_min_error+1))
  76.  
  77. # 11. Найдём среднюю погрешность:
  78. avg_error = sum(error_list) / len(error_list) # cумму каждого элемента разделим на количество 15
  79. print('Cредняя погрешность = %5.2f%%' % (avg_error * 100))
  80.  
  81. # НАЧИНАЕМ ОБРЕЗАТЬ КАЖДЫЙ ИЗ СПИСКОВ
  82. # ОБРЕЖЕМ КАЖДЫЙ ИЗ СПИСКОВ ДЛЯ НАЧАЛА
  83. # Начнём с опеределения границ правильным способом
  84. t300 = int(t_list.index(300)) # номер значения температуры 300 кельвинов в списке
  85. t1400 = int(t_list.index(1400)) # номер значения температуры 300 кельвинов в списке
  86. #теперь обрезать этот список t_list с температурой, обрезанный список вывести максимальную и среднюю погрешность используя формулы выше# ограничим список теперь в пределах температур от 300 до 1400 Кельвинов
  87. t_list_slice = t_list[t300:t1400+1] # прибавим в конце 1, чтобы попало конечное число 1400 в список
  88. #print(t_list_slice, '- обрезанный список температур')  - testok
  89. lambda_exp_list_slice = lambda_exp_list[t300:t1400]
  90. #print(lambda_exp_list_slice, '- обрезанный список экспериментальных значений') - testok
  91.  
  92. error_list_slice = error_list[t300:t1400]
  93. #print(error_list_slice, '- обрезанный список погрешностей') - testok
  94. print()
  95. print()
  96. print()
  97. max_error_slice = max(error_list_slice) * 100 # верно получилось
  98. print('%4.2f' % max_error_slice, '- максимальный процент отклонения на обрезанном промежутке')
  99. avg_error_slice = (sum(error_list_slice) / len(error_list_slice))*100 # cумму каждого элемента разделим на количество
  100. print('%4.2f' % avg_error_slice, '- средний процент отклонений') # 10.09.20 - пока неверно. Почему?
  101. print()
  102. print()
  103. print()
  104. print()
  105. # Со следующей строки мусорный код, НУЖНО УДАЛИТЬ
  106. # Теперь нужно обрезать список экспериментальных теплопроводностей через цикл рассчитаем каждое соответсвующее значение и выведем на экран(необязательно но охота)
  107. print('-' * 45)
  108. print('| %1s | | %7s | %7s | %7s |%8s |' % ('№', 't', 'L(t)', 'Exp(t)', 'error'))
  109. print('-' * 45)
  110. # c 94 cтроки и ниже мусорный код, удалить
  111. for i in range(len(t_slice_list)):
  112.     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%% | - почему без ошибки обязательно нужно два знака процентов в конце форматного вывода
  113.     #i+1 не добавляет значений, а Прибавляет цифру к текущему значению, чтобы был ровный счёт
  114.     # если в форматном выводе мы пишем %8d или %8s, а число или строка состоит из меньшего количества знаков, то остальные знаки будут пробелами в начале или конце
  115. print('-' * 45)
  116. lambda_exp_slice_list = lambda_exp_list[int(t_list.index(300)): int(t_list.index(1400)+1)]
  117. # идеи: вывести полностью новый список с расчетом температур в промежутке от 300 до 1400 включительно
  118. # и продолжать работать с этим новым списком
  119. # но пока не понятно как это сделать быстрее и красивее
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement