ЛБ8
.docx
Инженерная школа природных ресурсов
Направление подготовки Химическая технология
Отделение химической инженерии
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА PYTHON
Отчет по лабораторной работе № 8
Функции и функциональные возможности языка Python
Выполнил студент гр. ХИМ54 А.В. Чижова
(Подпись)
01.01.2026 г.
Отчет принят:
Преподаватель
доцент ОХИ ИШПР, к.т.н. В.А. Чузлов
(Подпись)
_____ _____________ 2026 г.
Томск 2026 г.
Задание 1
Формула нормализованной гауссовой кривой со средним значением μ и стандартным отклонением σ записывается следующим образом:
Необходимо написать "ленивую" функцию для вычисления гауссовых кривых при μ = 0 и σ = 0.5; 1.0; 1.5. Используйте секту из 10 точек в интервале [-5 , 5].
Функция должна содержать следующие параметры:
mu: float – параметр μ
sigma: float – параметр σ
bounds: tuple[float, float] – интервал точек
npoints: int – количество точек из интервала bounds для расчёта кривой Гаусса
Программная реализация:
import math
def gaussian(
mu: float,
sigma: float,
bounds: tuple[float, float],
npoints: int,
):
start, end = bounds
step = (end - start) / (npoints - 1)
for point in [start + i * step for i in range(npoints)]:
yield (1/(sigma * math.sqrt(2*math.pi)))*math.exp((-(point - mu) ** 2)/(2 * mu * mu))
bounds = -5, 5
points = 10
mu = 5
sigma1 = 0.5
sigma2 = 1.0
sigma3 = 1.5
gaussian1 = gaussian(mu, sigma1, bounds, points)
gaussian2 = gaussian(mu, sigma2, bounds, points)
gaussian3 = gaussian(mu, sigma3, bounds, points)
print('-------------sigma=0.5---------------')
for point in gaussian1:
print(point)
print('-------------sigma=1.0---------------')
for point in gaussian2:
print(point)
print('-------------sigma=1.5---------------')
for point in gaussian3:
print(point)
Ответ:
-------------sigma=0.5---------------
0.10798193302637613
0.16430377692481163
0.2379563808481531
0.3280201493519873
0.43038492200606215
0.5374857230826479
0.6388960110447045
0.722847659765487
0.7784249383434928
0.7978845608028654
-------------sigma=1.0---------------
0.05399096651318806
0.08215188846240581
0.11897819042407655
0.16401007467599366
0.21519246100303108
0.26874286154132393
0.31944800552235225
0.3614238298827435
0.3892124691717464
0.3989422804014327
-------------sigma=1.5---------------
0.035993977675458706
0.05476792564160388
0.07931879361605104
0.10934004978399578
0.1434616406686874
0.17916190769421597
0.2129653370149015
0.24094921992182905
0.25947497944783093
0.2659615202676218
Задание 2
Закон Бугера–Ламберта–Бера связывает концентрацию c вещества в образце раствора с интенсивностью света, проходящего через этот образец It с заданной толщиной слоя вещества l при известной длине волны λ:
где
– интенсивность света на входе в
вещество,
– коэффициент поглощения при длине
волны λ.
После проведения ряда измерений, позволяющих определить часть света, которая прошла сквозь раствор, It/I0, коэффициент поглощения α можно определить при помощи линейной аппроксимации:
Несмотря на то, что эта прямая проходит через начало координат (y = 0 при c = 0), мы будем выполнять подгонку для более общего линейного отношения:
где
m
=
с проверкой k
на приближение к нулю.
Коэффициенты линейной аппроксимации можно найти по следующим формулам:
где n – количество экспериментальных точек.
При рассмотрении образца раствора с толщиной слоя 0.8 см при измерениях были получены данные, приведенные в таблице: отношение It/I0 при пяти различных концентрациях:
С, моль/л |
It/I0 |
0.3 |
0.851 |
0.5 |
0.832 |
0.7 |
0.753 |
1.0 |
0.764 |
1.3 |
0.791 |
Используя линейную аппроксимацию, определите коэффициент α.
Этапы решения
Реализуйте функцию для нахождения коэффициентов линейной аппроксимации экспериментальных данных по концентрации и отношению It/I0.
Определите коэффициент α.
Программная реализация:
import math
from typing import List, Tuple
def linear_regression(c: List[float], y: List[float]) -> Tuple[float, float]:
n = len(c)
sum_c = sum(c)
sum_y = sum(y)
sum_c2 = sum(ci * ci for ci in c)
sum_cy = sum(ci * yi for ci, yi in zip(c, y))
denominator = n * sum_c2 - sum_c * sum_c
k = (sum_y * sum_c2 - sum_c * sum_cy) / denominator
m = (n * sum_cy - sum_c * sum_y) / denominator
return k, m
def calculate_alpha(c_values: List[float], It_I0_values: List[float], l: float) -> float:
y_values = [math.log(value) for value in It_I0_values]
k, m = linear_regression(c_values, y_values)
print(f"Коэффициенты линейной регрессии:")
print(f" m = {m:.6f}")
print(f" k = {k:.6f} (теоретически должен быть близок к 0)")
print(f" Абсолютное значение |k| = {abs(k):.6f}")
alpha = -m / l
return alpha
def main() -> None:
"""Основная функция программы."""
# Экспериментальные данные
c_values = [0.3, 0.5, 0.7, 1.0, 1.3]
It_I0_values = [0.851, 0.832, 0.753, 0.764, 0.791]
# Толщина слоя
l = 0.8 # см
print("Экспериментальные данные:")
print("c [моль/л] I_t/I_0")
print("-" * 25)
for c, ratio in zip(c_values, It_I0_values):
print(f"{c:8.1f} {ratio:10.3f}")
print()
print("Вычисленные значения y = ln(I_t/I_0):")
print("c [моль/л] y = ln(I_t/I_0)")
print("-" * 35)
for c, ratio in zip(c_values, It_I0_values):
y = math.log(ratio)
print(f"{c:8.1f} {y:10.6f}")
print()
# Вычисляем коэффициент поглощения α
alpha = calculate_alpha(c_values, It_I0_values, l)
print("\n" + "=" * 50)
print(f"РЕЗУЛЬТАТ:")
print(f"Коэффициент поглощения α = {alpha:.6f} л/(моль·см)")
print("=" * 50)
if __name__ == "__main__":
main()
Ответ:
Экспериментальные данные:
c [моль/л] I_t/I_0
-------------------------
0.3 0.851
0.5 0.832
0.7 0.753
1.0 0.764
1.3 0.791
Вычисленные значения y = ln(I_t/I_0):
c [моль/л] y = ln(I_t/I_0)
-----------------------------------
0.3 -0.161343
0.5 -0.183923
0.7 -0.283690
1.0 -0.269187
1.3 -0.234457
Коэффициенты линейной регрессии:
m = -0.082520
k = -0.163805 (теоретически должен быть близок к 0)
Абсолютное значение |k| = 0.163805
==================================================
РЕЗУЛЬТАТ:
Коэффициент поглощения α = 0.103150 л/(моль·см)
==================================================
