Рассчитываем разгон компрессора
作者
function create_compressor_map(mdot_TLU, pr_TLU, omega_TLU, eff_levels;
n_points_per_contour=200, n_grid=100,
xlims=(0,0.7), ylims=(1,3.5))
"""
Создает график напорной характеристики компрессора
Arguments:
- mdot_TLU: матрица приведенного массового расхода (линии частот)
- pr_TLU: матрица степени повышения давления
- omega_TLU: вектор частот вращения
- eff_levels: массив кортежей (data_matrix, level) для контуров КПД
Keyword arguments:
- n_points_per_contour: количество точек на контуре КПД
- n_grid: размерность сетки для интерполяции
- xlims, ylims: пределы осей
Returns:
- p: объект графика Plots
- eta_TLU: матрица КПД на линиях частот
"""
# Интерполяция данных КПД
all_mdot, all_pr, all_eta = Float64[], Float64[], Float64[]
for (data, level) in eff_levels
# Замыкаем контур
closed = vcat(data, data[1:1, :])
# Вычисляем кумулятивную длину вдоль контура
n = size(closed, 1)
dist = zeros(n)
for i in 2:n
dist[i] = dist[i-1] + sqrt((closed[i,1] - closed[i-1,1])^2 + (closed[i,2] - closed[i-1,2])^2)
end
t = dist ./ dist[end] # параметризация от 0 до 1
# Создаем равномерную параметризацию
t_uniform = range(0, 1, length=n_points_per_contour)
# Интерполируем mdot и pr вдоль контура
mdot_interp = linear_interpolation(t, closed[:,1], extrapolation_bc=Interpolations.Flat())
pr_interp = linear_interpolation(t, closed[:,2], extrapolation_bc=Interpolations.Flat())
# Добавляем точки
append!(all_mdot, mdot_interp.(t_uniform))
append!(all_pr, pr_interp.(t_uniform))
append!(all_eta, fill(level, n_points_per_contour))
end
# Создание регулярной сетки и Интерполяция
mdot_grid = range(minimum(all_mdot), maximum(all_mdot), length=n_grid)
pr_grid = range(minimum(all_pr), maximum(all_pr), length=n_grid)
itp = ScatteredInterpolation.interpolate(Shepard(), hcat(all_mdot, all_pr)', all_eta)
eta_grid = [only(evaluate(itp, [m, p])) for m in mdot_grid, p in pr_grid]
# Вычисление eta_TLU (КПД на линиях частот вращения)
eta_TLU = [only(evaluate(itp, [mdot_TLU[i,j], pr_TLU[i,j]]))
for i in 1:size(mdot_TLU,1), j in 1:size(mdot_TLU,2)]
# Создание графика
p = plot(xlabel="Приведенный расход воздуха, г/с",
ylabel="Степень повышения давления",
title="Напорная характеристика компрессора",
xlims=xlims, ylims=ylims,
legend=:outerbottomright, size=(900,500))
# Линии частот вращения
for i in 1:size(mdot_TLU,1)
plot!(p, mdot_TLU[i,:], pr_TLU[i,:],
linewidth=2, label="$(omega_TLU[i]) rpm")
end
# Контуры эффективности
contour!(p, mdot_grid, pr_grid, eta_grid',
levels=0.80:0.02:0.9,
linewidth=1.5, seriescolor=:inferno,
colorbar=false, fill=false)
# Построение линий срыва и помпажа
# Левая граница (срыв) - минимальный расход
stall_mdot = [mdot_TLU[i, 1] for i in 1:size(mdot_TLU,1)]
stall_pr = [pr_TLU[i, 1] for i in 1:size(mdot_TLU,1)]
# Правая граница (помпаж) - максимальный расход
surge_mdot = [mdot_TLU[i, end] for i in 1:size(mdot_TLU,1)]
surge_pr = [pr_TLU[i, end] for i in 1:size(mdot_TLU,1)]
# Сортировка по расходу
stall_sorted = sort([(stall_mdot[i], stall_pr[i]) for i in 1:length(stall_mdot)], by=x->x[1])
surge_sorted = sort([(surge_mdot[i], surge_pr[i]) for i in 1:length(surge_mdot)], by=x->x[1])
# Линия помпажа (правая граница)
plot!(p, [p[1] for p in surge_sorted], [p[2] for p in surge_sorted],
linewidth=3, color=:orange, linestyle=:dash,
label="Линия помпажа (Surge line)")
# Линия срыва (левая граница)
plot!(p, [p[1] for p in stall_sorted], [p[2] for p in stall_sorted],
linewidth=3, color=:red, linestyle=:dash,
label="Линия срыва (Stall line)")
return p, eta_TLU
end