You
Привет. Ответь на вопрос. Пишется симулятор жидкости. Встаёт вопрос - завести дополнительный массив или сделать число повтор одного и того-же вычисления. Существует формула чтобы определить как поступить?

Скрытый текст

Assistant

Привет! Когда дело доходит до выбора между использованием дополнительного массива или выполнением численных вычислений на каждом шаге, важно учитывать несколько факторов:

Сложность вычисления: Если формула для вычисления значения достаточно сложная и требует значительных ресурсов процессора, то использование дополнительного массива может быть более эффективным.

Частота обновления данных: Если данные в массиве изменяются часто или разнообразно, то вычисление на каждом шаге может быть предпочтительнее.

Объём памяти: Использование дополнительного массива увеличивает потребление оперативной памяти. Если ресурсы ограничены, это может стать критичным фактором.

Кэширование и локальность данных: Современные процессоры эффективно работают с данными, которые находятся рядом друг с другом в памяти (локальность данных). Если использование массива позволяет улучшить эту локальность, это может ускорить вычисления.

Точность и надёжность: В некоторых случаях предпочтительнее использовать массивы для хранения промежуточных результатов, чтобы минимизировать ошибки округления или других проблем с точностью при многократном выполнении сложных вычислений.

К сожалению, нет одной формулы, которая могла бы точно определить, что лучше в вашем конкретном случае. Это решение часто принимается на основе профилирования и тестирования производительности вашего кода под конкретными условиями использования. Попробуйте обе подходы и измерьте время выполнения для выбора наиболее эффективного.

Привет Хабр. Разумеется я не последовал рекомендациям нейросети, как и не стал её обременять подробностями задачи, потому что имею некоторый опыт в алгоритмизации и хочу его увеличить. Не могу сказать что и в этот раз это что‑то сногсшибательное, но новичку можно ознакомится чтобы знать как ориентировать своё мышление в решении подобных задач конвейерной обработки данных. Публикация будет отражать именно суть решения задачи, и не более, чтобы не усложнять теорией. И под спойлером предыстория и ещё немного интересного по ссылкам, так или иначе связанного с публикацией. Единственное что хочется отметить в превью, что главный скил ведения уникальных проектов — умение оптимально и экономично связывать в единую сеть (планировать) все необходимые опорные вершины (а они могут быть очень разными, даже если не говорить о самой своей жизни, то можно сказать о симуляторе жизни) проекта необходимые для его развития и разработки. Почему в названии «трек» — потому что это беглый обзор ряда решений, с основным в конце. Это более полезный трек для новичков, специалисты (но из материала в сети следует что не все) наверняка знакомы с подобными трюками. Если не смущает такая круговерть — можете читать (тут по ссылке есть отступление на геометрическое изыскание по вычислению угла на сетке координат по точкам, формулы там не верны скорее всего, так как их писала LM, у меня не было на них пока времени — теперь будет, но решение верное).

Предыстория решения

Не так давно ясделал поддув под маску сварщика, так сказать — для чистоты сознания. Проработал я с ним пол‑года и решил что неудобно, хотя было удобно вполне, но хотелось чтобы решение было ещё более незаметным и более удобным. Подробности под спойлером

Скрытый текст

Первая реализация тут, с ней проработал пол‑года на монтаже МК с осени до весны, ощутив разницу в чистоте сознания я решил улучшить её, да и отсутствие кожуха на воздухозаборнике делало своё дело — несколько раз менял крыльчатку из‑за механических повреждений. Второй проект оказался менее удачным, как я и подозревал — двигатель в таком месте будет перегреваться и гореть.

И в силу того, что хотелось сделать улучшение, как говорится «с душой», я решил сделать автоматический тюнинг аэродинамики, так как видел в сети, что студенты на западе делают автоматические тюнинги с помощью своих симуляторов и автоматическиого анализа в проектах для своих стеденческих работ. Так‑же решил сделать и я, но используя свои формулы и методы. И хоть мне уже может этот поддув уже не пригодится, но хочу доделать начатое, возможно пригодится другим, к тому же это будет некоторый опыт.

Организация пространства физической симуляции.

Тут всё шло последовательно, и если кому‑то интересны предыстории, то это тут, но там много воды, единственное — кроме способа определения угла направления вектора (направление вектора важно знать как с математической позиции так и с логической, но о логической позднее), пока это не отполировано за тем, что нужно было больше определённостей по организации конвейера цикла, но теперь уже будет, так как способ организации конвейера я придумал только вчера вечером. Саму‑же структуру пространства физической симуляции я решил оформить в двух массивах, ячейки которых для обработки их содержимого в теле цикла обработки представляются как вот эти жёлтые — ячейки одного массива (основного), и красные — ячейки межпространственного массива, они мной были внедрены в систему для исключения диагональных расчётов и уплотнения самой сетки данных для расчётов в целях экономии ресурсов памяти.

То есть тут планировалось, что вектора, содержащиеся в четырёх соседних ячейках (жёлтых) основного массива обработаются и результат запишется в ячейку межпространственного массива (красную), расположенную на изображении между этими четырьмя соседними ячейками основного. И на следующем этапе содержимое каждой ячейки основного массива будет складываться исходя из хранимого в ней значения вкупе с значениями окружающих её ячеек межпространственного массива.

Тут же встал простой вопрос

Как быть, если нам всегда надо баланисровать в каждой ячейки потоки в неё приходящие с потоком из неё исходящим? Чтобы определять исходящий поток и входящий — программе нужна логика. Для ещё большего уплотнения расчёта данных, и из‑за необходимости логической обработки пересечений векторов, мной было решено расширить систему расчёта до такой, чтобы данные обрабатывались для каждых двух соседних, как по вертикали, так и горизонтали (на изображении взять для упрощения идеальный случай горизонтальной ориентации векторов), и уже потом только, с учётом направлений и углов, записывались в ячейки межпространственного массива.

Тут ничего сложного, и решение пришло само собой тут, чуть ранее чем основное решение по публикации:

Так например, чтобы узнать значение притока двух соседних ячеек (вектора) нужно обязательно вести логическую обработку, для упрощения которой логично было‑бы их расположение на линейке отсчёта. Тогда пусть ячейка с вектором А будет иметь множитель с знаком «, а с вектором Б множитель со знаком «‑» (аналогично А и Б1). Значение вектора А положительное и множитель положительный, значит его поток прибывает в пространство между ячейками векторов А и Б. Множитель вектора Б отрицательный, и вектор отрицательный значит поток вектора Б так‑же прибывает в это это пространство. Аналогично с векторами А1 и Б1 только значения обратные — получится убывание. Я уже не помню — учили ли меня в школе таким трюкам, или я сам им научился, не важно.

И вот после этого встал основной очевидный вопрос

Сохранять данные в новые массивы, или перерасчитывать? С учётом того, что симуляция планируется 3D, понятно, что объёмы памяти нужны будут очень большие, ведь массивы будет содержать огромные объёмы данных. Тогда добавление ещё массивов усложнит использование программы, а если отдать предпочтение расчёту — увеличит время получения результата. Из изображения выше понятно, что для обработки соседних двух ячеек по вертикали — достаточно запоминать всего один результат вычислений на всю линию из таких двух соседних ячеек и так двигаться по линии. То‑есть, для обработки образуемых двумя ячейками столбцов всего двумерного массива — нужна всего одна ячейка, чтобы избежать повтора расчётов. Ну хорошо, а вот с обработкой соседних двух ячеек по горизонтали это не пройдёт, что делать, заводить новый почти такой‑же по объёму массив? Вовсе нет, нужно запомнить при движении в этом же цикле вдоль этой же линии массива данных, но только результаты расчёта каждых соседних двух ячеек по горизонтали, и только в одномерном массиве на две ячейки меньше, чем длина основного массива!

Но согласитесь что это ведь не такой же огромный массив, а всего лишь одна линия, и при этом мы избегаем любых повторяющихся расчётов.

На этом пока всё. Вот так, между делами мной был создан скелет проекта

Сам код пишется в Lazaus на FPC при использовании OpenGL, импорт аэродинамических моделей с помощью плагина из Blender 3D, имеет вроде приличное превью с 3D навигацией, неплохо вроде работает, но пока не выкладываю, так как скелет пока не оброс мясом кодом вычислений, но теперь начнёт. Надеюсь вы скоро увидите рабочий проект — осталось не много и с пайтоном мне помогает LM, поэтому сильно не задерживаюсь с ним — пробные аддоны уже пробовал.

Разумеется я смотрел симуляторы в сети — мне ни один не зашёл, но мне понравилось как один студент сделал проект (на английском, где‑то на западе) для автоматического тюнинга своей аэромодели для своего задания, у меня задания нет, но я решил пойти тоже путём автоматизации. Строго не судите, ибо не специалист, но решать задачи тоже могу, даже своими методами. Заранее благодарен за положительные отзывы, и равнодушен к негативу (главное — верить: всё — будет).

Если увидите ошибку в тексте — прошу уведомить, за что отдельное спасибо, так вроде все исправил, была кучка небольшая.