mirror of
https://github.com/eddyem/eddys_snippets.git
synced 2025-12-06 02:35:12 +03:00
some little joke
This commit is contained in:
parent
ca7a53ee1c
commit
ebc8144271
197
deepseek/transformator
Normal file
197
deepseek/transformator
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
Да, конечно! Написать программу на C для этой задачи вполне возможно. Это典型的 задача инженерного расчета, которая хорошо ложится на процедурный подход языка C.
|
||||||
|
|
||||||
|
Вот пример структуры программы на C:
|
||||||
|
|
||||||
|
## Структура программы
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
// Константы
|
||||||
|
#define PI 3.141592653589793
|
||||||
|
#define MU_0 (4.0 * PI * 1e-7)
|
||||||
|
#define DENSITY_CU 8900.0 // плотность меди, кг/м³
|
||||||
|
#define PRICE_CU 8.5 // цена меди, у.е./кг
|
||||||
|
#define K_FILL 0.3 // коэффициент заполнения окна
|
||||||
|
#define EFFICIENCY 0.95 // КПД трансформатора
|
||||||
|
|
||||||
|
// Структура для описания сердечника
|
||||||
|
typedef struct {
|
||||||
|
char name[20]; // название сердечника
|
||||||
|
double S_fe; // сечение магнитопровода, м²
|
||||||
|
double S_window; // площадь окна, м²
|
||||||
|
double price_fe; // стоимость сердечника, у.е.
|
||||||
|
double B_max; // максимальная индукция, Тл
|
||||||
|
double k_fe; // коэффициент формы
|
||||||
|
} Core;
|
||||||
|
|
||||||
|
// Структура для параметров трансформатора
|
||||||
|
typedef struct {
|
||||||
|
double P_out; // выходная мощность, Вт
|
||||||
|
double U_in; // входное напряжение, В
|
||||||
|
double U_out; // выходное напряжение, В
|
||||||
|
double f; // частота, Гц
|
||||||
|
double J; // плотность тока, А/мм²
|
||||||
|
} TransformerParams;
|
||||||
|
|
||||||
|
// Структура для результатов расчета
|
||||||
|
typedef struct {
|
||||||
|
Core core;
|
||||||
|
double N1, N2; // число витков
|
||||||
|
double d_wire1, d_wire2; // диаметры проводов, мм
|
||||||
|
double cost_total; // общая стоимость
|
||||||
|
double cost_cu; // стоимость меди
|
||||||
|
int is_valid; // флаг валидности расчета
|
||||||
|
} CalculationResult;
|
||||||
|
|
||||||
|
// Функция расчета одного варианта
|
||||||
|
CalculationResult calculate_transformer(const TransformerParams* params, const Core* core) {
|
||||||
|
CalculationResult result = {0};
|
||||||
|
result.core = *core;
|
||||||
|
|
||||||
|
// Расчет числа витков
|
||||||
|
result.N1 = (params->U_in * 1.05) / (4.44 * params->f * core->B_max * core->S_fe);
|
||||||
|
result.N2 = (params->U_out * 1.05) / (4.44 * params->f * core->B_max * core->S_fe);
|
||||||
|
|
||||||
|
// Расчет токов
|
||||||
|
double I1 = params->P_out / (params->U_in * EFFICIENCY);
|
||||||
|
double I2 = params->P_out / params->U_out;
|
||||||
|
|
||||||
|
// Расчет сечений проводов
|
||||||
|
double s_wire1 = I1 / (params->J * 1e6); // м²
|
||||||
|
double s_wire2 = I2 / (params->J * 1e6); // м²
|
||||||
|
|
||||||
|
result.d_wire1 = sqrt(s_wire1 * 4 / PI) * 1000; // мм
|
||||||
|
result.d_wire2 = sqrt(s_wire2 * 4 / PI) * 1000; // мм
|
||||||
|
|
||||||
|
// Проверка заполнения окна
|
||||||
|
double occupied_area = (result.N1 * s_wire1 + result.N2 * s_wire2) / K_FILL;
|
||||||
|
result.is_valid = (occupied_area <= core->S_window);
|
||||||
|
|
||||||
|
if (result.is_valid) {
|
||||||
|
// Оценка стоимости меди (упрощенно)
|
||||||
|
// Предполагаем среднюю длину витка пропорциональной корню из площади окна
|
||||||
|
double mean_length_turn = 4 * sqrt(core->S_window); // м
|
||||||
|
double length_wire1 = result.N1 * mean_length_turn;
|
||||||
|
double length_wire2 = result.N2 * mean_length_turn;
|
||||||
|
|
||||||
|
double volume_cu = length_wire1 * s_wire1 + length_wire2 * s_wire2;
|
||||||
|
double mass_cu = volume_cu * DENSITY_CU;
|
||||||
|
|
||||||
|
result.cost_cu = mass_cu * PRICE_CU;
|
||||||
|
result.cost_total = core->price_fe + result.cost_cu;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Основная функция оптимизации
|
||||||
|
Core find_optimal_core(const TransformerParams* params, Core* cores, int num_cores) {
|
||||||
|
CalculationResult best_result = {0};
|
||||||
|
best_result.cost_total = DBL_MAX;
|
||||||
|
int best_index = -1;
|
||||||
|
|
||||||
|
printf("Расчет трансформатора:\n");
|
||||||
|
printf("P = %.1f Вт, Uin = %.1f В, Uout = %.1f В, f = %.1f Гц\n\n",
|
||||||
|
params->P_out, params->U_in, params->U_out, params->f);
|
||||||
|
|
||||||
|
for (int i = 0; i < num_cores; i++) {
|
||||||
|
CalculationResult result = calculate_transformer(params, &cores[i]);
|
||||||
|
|
||||||
|
printf("Сердечник: %s\n", cores[i].name);
|
||||||
|
printf(" N1 = %.0f, N2 = %.0f, d1 = %.2f мм, d2 = %.2f мм\n",
|
||||||
|
result.N1, result.N2, result.d_wire1, result.d_wire2);
|
||||||
|
printf(" Стоимость: сердечник = %.2f, медь = %.2f, общая = %.2f\n",
|
||||||
|
cores[i].price_fe, result.cost_cu, result.cost_total);
|
||||||
|
printf(" Статус: %s\n\n", result.is_valid ? "ПОДХОДИТ" : "НЕ ПОДХОДИТ");
|
||||||
|
|
||||||
|
if (result.is_valid && result.cost_total < best_result.cost_total) {
|
||||||
|
best_result = result;
|
||||||
|
best_index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (best_index >= 0) {
|
||||||
|
printf("ОПТИМАЛЬНЫЙ ВАРИАНТ:\n");
|
||||||
|
printf("Сердечник: %s\n", cores[best_index].name);
|
||||||
|
printf("Общая стоимость: %.2f у.е.\n", best_result.cost_total);
|
||||||
|
return cores[best_index];
|
||||||
|
} else {
|
||||||
|
printf("НЕ УДАЛОСЬ НАЙТИ ПОДХОДЯЩИЙ СЕРДЕЧНИК!\n");
|
||||||
|
Core empty = {0};
|
||||||
|
return empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Пример использования
|
||||||
|
int main() {
|
||||||
|
// Параметры трансформатора
|
||||||
|
TransformerParams params = {
|
||||||
|
.P_out = 100.0, // 100 Вт
|
||||||
|
.U_in = 220.0, // 220 В
|
||||||
|
.U_out = 12.0, // 12 В
|
||||||
|
.f = 50.0, // 50 Гц
|
||||||
|
.J = 3.0 // 3 А/мм²
|
||||||
|
};
|
||||||
|
|
||||||
|
// База данных стандартных сердечников
|
||||||
|
Core cores[] = {
|
||||||
|
{"ШЛ20х25", 5.0e-4, 4.0e-4, 15.0, 1.2, 1.2},
|
||||||
|
{"ШЛ25х32", 8.0e-4, 6.4e-4, 22.0, 1.2, 1.2},
|
||||||
|
{"ШЛ32х40", 12.8e-4, 10.0e-4, 35.0, 1.2, 1.2},
|
||||||
|
{"Тороид_40", 12.0e-4, 8.0e-4, 28.0, 1.3, 1.6},
|
||||||
|
{"Тороид_50", 15.0e-4, 12.0e-4, 42.0, 1.3, 1.6}
|
||||||
|
};
|
||||||
|
|
||||||
|
int num_cores = sizeof(cores) / sizeof(cores[0]);
|
||||||
|
|
||||||
|
// Поиск оптимального сердечника
|
||||||
|
Core optimal = find_optimal_core(¶ms, cores, num_cores);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ключевые особенности реализации:
|
||||||
|
|
||||||
|
1. **Модульная структура** - разделение на логические блоки
|
||||||
|
2. **Структуры данных** для параметров, сердечников и результатов
|
||||||
|
3. **Итерационный поиск** по базе сердечников
|
||||||
|
4. **Проверка ограничений** (заполнение окна)
|
||||||
|
5. **Критерий оптимизации** - минимальная стоимость
|
||||||
|
|
||||||
|
## Дополнительные улучшения, которые можно добавить:
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Функция для итерационного подбора плотности тока
|
||||||
|
void optimize_current_density(TransformerParams* params, Core* cores, int num_cores) {
|
||||||
|
double best_J = 2.0;
|
||||||
|
double best_cost = DBL_MAX;
|
||||||
|
|
||||||
|
for (double J = 2.0; J <= 4.0; J += 0.5) {
|
||||||
|
params->J = J;
|
||||||
|
// ... расчет для каждой плотности тока
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Чтение базы сердечников из файла
|
||||||
|
int read_cores_from_file(const char* filename, Core** cores) {
|
||||||
|
// ... реализация чтения из CSV или текстового файла
|
||||||
|
}
|
||||||
|
|
||||||
|
// Расчет габаритной мощности
|
||||||
|
double calculate_gabarit_power(const Core* core, const TransformerParams* params) {
|
||||||
|
return core->S_fe * core->S_window * core->k_fe *
|
||||||
|
params->J * 1e6 * core->B_max * params->f;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Такой подход позволяет:
|
||||||
|
- Легко добавлять новые типы сердечников
|
||||||
|
- Менять критерии оптимизации
|
||||||
|
- Интегрироваться с другими системами
|
||||||
|
- Проводить параметрические исследования
|
||||||
|
|
||||||
|
Программа будет эффективно работать даже с большими базами сердечников и может быть легко расширена для дополнительных расчетов.
|
||||||
Loading…
x
Reference in New Issue
Block a user