Здравствуйте, McSeem2, Вы писали:
MS>Собственно, чего это я приходил-то, может сказать чего хотел? А, ну да — Алан Голуб, Веревка достаточной длины, чтобы прострелить себе ногу. Книжка такая. http://proklondike.com/books/cpp/allen_golub_rules.html MS>Настоятельно рекомендуется всем начинающим и не только. И не только про C++.
Книжка была хорошая в свои времена, а теперь она сильно устарела. Насколько я помню, про STL и исключения в ней ни слова.
А то что Шилдта в топку — это точно.
Я так понял, вычисления в Matlab жрут много памяти, и это одна из причин, почему ты хочешь переписать всё на C++, так?
Приведу пример из собственной практики.
Надо было найти выпуклую оболочку точек. Пока работал в 4-хмерном пространстве, всё было хорошо. Функция Matlab'а всё считала, все были довольны. Потом стало нужно найти выпуклую оболочку в 20-тимерном пространстве. Что ж, делов-то. Запускаю программу, жду результата. Через несколько часов вижу, что Matlab съел всю память на компьютере, стал писать в swap. Скорость упала на порядок, непорядок! Поехал, купил себе еще пару гигабайт памяти. Запустил вечером, проснулся утром — оппа, опять всё съела, а работа еще не окончена.
Почитал потом подробнее про алгоритм. Кажется, это был "метод заворачивания подарка". Оказалось, что для моей задачи (столько-то точек в 20-мерном пространстве) мне бы понадобилось 10-в-какой-то-степени гигабайт памяти и подождать 10-в-какой-то-степени лет. Никаким переписыванием на C++ эту проблему решить бы не удалось.
Так что, если проблему вычислений ты не можешь решить покупой дополнительного гигабайта памяти, то есть хороший шанс, что ты ее не решишь переписыванием на C++. Прежде чем переписывать, попробуй сам себе объяснить, что это тебе даст.
Здравствуйте, труженик села, Вы писали:
ТС>Книжка была хорошая в свои времена, а теперь она сильно устарела. Насколько я помню, про STL и исключения в ней ни слова.
Она и сейчас хорошая — для тех, кто шарит. Все в ней сказанное можно экстраполировать и на стл и исключения.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Извиняюсь, если уже упоминали книжечку, Yair Shapira "Solving PDEs in C++". Довольно интересное чтиво, несмотря на название,
в книге речь идет не только о решении УРЧП (этому как раз уделено не особенно много), а так же о подходах к решению ОДУ,
оценке погрешностей численных алогоритмов, о реализации основных математических структур на C++, численное дифференцирование,
анализ устойчивости решения ДУ, об алгоритмах работы с разреженными матрицами, параллелизме при вычислениях, затронуты алгоритмы обработки изображений и о многом другом.
Все это дается с использованием ООП подхода в довольно доходчивой форме. Книга ходила по интернету в электронном виде и
при желании можно ее найти, в переводе на русский ее не видел. Рекомендую к прочтению.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте, Mazay, Вы писали:
M>>Честно говоря не понял, зачем тебе C++. Ты думаешь когда-нибудь появится время на "толковое описание программы и оптимизацию кода"? C++ однозначно хуже Матлаба для быстрого программирования. По крайней мере пока не набьешь руку и не освоишь библиотек своей области.
T>Если в вкратце, то часто надо рассчитывать различные электротехнологические установки на основе численных методов (математическое моделирование, метод конечных элементов, метод конечных разностей и другие численные методы). Многое считаю используя связку Matlab и специализированный пакет для матмоделирования COMSOL Multiphysics. Но все чаще упираюсь в потолок – то алгоритм решения нелинейных уравнений разработчиками написан дыряво, то идет переполнение памяти (матрица не влазит) при решении задач большой размерности и т.д. Постоянно приходиться плясать с бубном и как то латать дыры. Вот и подумал что надо постепенно, не торопясь, в качестве хобби, нестандартные математические модели рассчитывать/писать на каком-нибудь серьезном языке. Численные методы в основном все на Fortran реализованы. Низнаю с чем это связанно – с тем что на Fortran быстрее создавать приложения или с какими-то ограничениями С++.
Теперь понятно. Тебе нужно решать конкретную задачу используя весь доступный инструментарий.
Много численных методов на Фортране потому что на нем можно быстро сваять Proof of Concept и при этом получить достаточно оптимизированный код, чтобы можно было сравнить эффективность его со старыми вылизаными программами. Я видел не так много кода на Фортране, но все что я видел — это код с очень высокой связностью, что есть плохо, когда ты используешь много всяких алгоритмов и оптимизаций. То есть код на Фортране выглядит хорошо, пока ты пишешь алгоритм в чистом виде или программу с нуля, а когда нужно совместить несколько хитрых штук (мемоизации, кэширование, переупорядочивание, дополнительные индексы, приближения, хитрые распределения и все разом) или дополнить уже написаный код, то все очень быстро запутывается. Повторюсь — я не спец по Фортрану, может в современных версиях такое же крутое ООП как и в С++ и есть шаблоны, но я просто не видел хороших примеров.
T>Но я вижу две книги «Langtangen, Computational Partial Differential Equations, Numerical Methods and Diffpack Programming» и «Langtangen, Tveito. Advanced Topics in Computational Partial Differential Equations: Numerical Methods and Diffpack Programming». Вижу какие нестандартные расчеты делали авторы этих книг. Вижу универсальный подход авторов к решению различных задач матмоделирования. Там все на С++, поэтому то и делаю ставку на С++.
С++ это все таки язык общего назначения, промышленный язык, а в промышленном программировании со сложностью и связностью кода борются давно и упорно. Так что если нужна большая библиотека на все случаи жизни с множеством хитрых штук (см. выше) прикручиваемая куда угодно, чтоб её можно было продать, то вполне логично, что её напишут на С++.
T>Естественно самостоятельно взвесить все плюсы и минусы С++ и Fortran, провести сравнительный анализ этих языков в приложении к задачам математического моделирования и численным методам не могу.
Если просто упираешься в память — то пиши на Фортране, может поможет а может и нет .
Если много багов в используемых библиотеках — поздравляю, ты вступил в клуб использующих мало кем используемые библиотеки. Здесь так принято. Вне зависимости от языка.
Если хочешь использовать крутые-навороченые библиотеки написаные на С++ — учи С++.
С++ начинай учить с Липмана "Язык программирования С++. Вводный курс" 3-е издание. Алгоритмов там нет. Сначала просто читаешь главы 1-5,7, 13 и параграф 15.1. Параллельно пытешься читать алгоритмы из alglib.sources.ru или что там у тебя.
Потом читаешь главы 6,10,12, 16 и 20 и смотришь http://www.sgi.com/tech/stl/ как справочник.
Здесь уже можно писать свой код и начинать искать библиотеки кроме стандартной. Сразу привыкай пользоваться контейнерами STL, итераторами, алгоритмами. Массивы/указатели приведут к трудноуловимым багам, которые ты пока ловить не умеешь. Хотя совсем без указателей не обойтись, особенно при взаимодействии со сторонними библиотеками. Накачай хороших шпаргалок по STL (здесь
LVV>Здравствуйте, tensor1982, Вы писали:
T>>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>>Спасибо!
Здравствуйте, tensor1982, Вы писали:
T>... А пока что в свободное время поучу С++. В книге все приложения с кодами на С++... T>Вот и делаю ставку на библиотеки diffpack, а до этого мне надо с С++ разобраться, особенно с той частью С++ которая мне нужна с учетом специфики задачи.
Здравствуйте, tensor1982, Вы писали:
T>Согласен, что библию и классиков прочесть рано или поздно надо будет. Но листая «Липпман. Основы программирования на C++» я не вижу ни одного примера работы с матрицами, ни одного решенного уравнения.
Тебе правильно советуют — изучать надо отдельно.
Примеры работы с матрицами можно найти в книгах по математике. Чтобы понимать как с ними работать о С++ можно вообще ничего не знать.
В С++ же надо понять другие абстракции, зная которые ты сможешь реализовать любую требуемую сущность, будь то матрица или отсек в космическом корабле. Разницы не будет, но нужно понимать, что при этом происходит.
Чтобы нормально реализовать матрицы придётся пожалуй кучу фич языка использовать (тут и шаблоны, и перегрузка операций, и проблемы с копированием больших значений), т.е. язык придётся знать.
Здравствуйте, tensor1982, Вы писали:
T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
Неплохим вариантом является изучение C++ не по книгам, а на основе какого-либо открытого математического пакета на C++ с хорошей документацией. Например, FreeFEM -- реализация метода конечных элементов, или Octave -- аналог MatLab.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
1. Выкинь Шилдта.
2. Страуструп + Мак Коннелл
3. Найти open source проект или попасть джуниором в хорошй проект, например компьютерное зрение, или обработка статистики.
4. Попробовать определить для себя прикладную область которая станет интересной.
1. Шилдта давно уже выкинул в топку
2. О каком Мак Коннелл идет речь?! «С. Макконнелл Совершенный код. 2-e издание» или «Дж. Макконнелл. Основы современных алгоритмов»?! Или нечто другое?!
Приведу несколько примеров использования С++ для решения специфических задач.
1. boost::numeric::ublas и его байндинги. Библиотека для работы с векторами и матрицами использующая expression templates, позволяющая выжать максимум скорости без потери читабельности.
2. Расчет Якобиана с использованием fadbad, подменяем тип с плавающей точкой на библиотечной и сразу получаем возможность считать частные производные для произвольных функций.
3. ATLAS
4. Анализ точности расчетов, подменяешь тип с плавающей точкой и расчитываешь погрешность вычислений , или регулируешь точность , или сравниваешь с эталонной точностью.
Читал по ветке выше что вы решаете по работе целый ряд сложных задач. Для тренировки идеально попробовать порешать их на С++.
Хотя давно уже не имел дела с Фортраном, я советую сначала попробовать себя в нем. Только после его изучения и приобретения опыта можно будет приступить к C/C++, да и то под вопросом.
Плюсы (Си ++) — очень сложный и противоречивый язык. К тому же достаточно низко-уровневый. Будет трудно. Особенно новичку. Много ненужных деталей. Чтобы достичь уровня мастера нужно потратить много месяцев или даже лет... Прочитать уйму книг. А иначе код будет оставлять желать лучшего. Результативность тоже.
Голый Си проще плюсов. Но непонятно, чем он может быть лучше Фортрана для ваших задач.
Фортран же себя очень хорошо зарекомендовал для численных расчетов. Он намного проще плюсов. В нем должно быть меньше ловушек. Писать легче. И скорее всего Фортран еще переживет плюсы. А если понадобиться какая-нибудь сишная библиотека, то ее, скорее всего, можно использовать в самом Фортране. Вот, с плюсовой библиотекой могут возникнуть проблемы, но и плюсы — не самый лучший выбор для написания библиотек.
Вообще говоря, программирование не ограничивается этими тремя языками. Например, для математика могут быть интересны OCaml и F#. Но здесь нужен английский и крайне желательно наличие в окружении хорошего программиста или системного администратора. Впрочем, таковой не помешал бы в любом случае.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++.
А правда надо?
T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
Библиотеки для "дробительных" расчетов писались и отлаживались на Фортране когда никакого С++ еще и в проекте не было, использовалось в его (С++) лучшие времена, да и сейчас тоже. Тут классы и иже с ними как бы и не нужны совсем.
Хотя, конечно, прославиться С++-шаблоном для решения дифференциальных уравнений n-ого порядка, и не обязательно линейных, никому не возбраняется. Флаг, как говорится, в руки, и boost на шею