Здравствуйте!
Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать.
Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
Спасибо!
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Книжки по С++ с уклоном в численные методы на русском мне не попадались.
Поищи на английском.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, tensor1982, Вы писали:
T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
такие вещи лучше отдельно ботать, вообще по плюсам довольно много хороших книг(страуструп, александревску, саттер, майерс и т.д), а по алгоритмам — лучше википедии(правда английской) ещё ничего не придумали.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Сообразил. В книге Джосаттиса по стандартной библиотеке есть описание valarray — специальный класс-шаблон для проведения численных расчетов.
А просто по С++ много хороших книжек. ИМХО, можно начинать с книжек Стэнли Липпмана.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Я щас выражу только свое мнение, которое происходит из личного общения с программистами, у которых профиль — математика и которые пишут на С++. Их код ужасен с точки зрения С++, он небезопасен и плохо поддерживаем, но зато четко соответствует его математической подоплеке. Безусловно, если все пройдет хорошо, он работает быстро, но, увы, так почти никогда не бывает в больших проектах.
Поэтому, совет у меня такой, не зацикливайся на математике, если ты новичек в С++, то прежде всего нужно понять суть языка, концепцию в его заложенную, его дух. После этого математика, приложенная к этому знанию перестанет мешать тебе решать задачу грамотно в рамках языка, а наоборот, дополнит и выведет программирование на совершенно новый уровень.
Поэтому выкинь нафиг Шилдта. Лучше Лимпмана, Страуструпа, Саттера, Мейерса. И после изучения, ты найдешь как лучше применить математику, намного лучше, чем если поступать наоборот.
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, tensor1982, Вы писали:
T>>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
S>такие вещи лучше отдельно ботать, вообще по плюсам довольно много хороших книг(страуструп, александревску, саттер, майерс и т.д), а по алгоритмам — лучше википедии(правда английской) ещё ничего не придумали.
Да ладно, есть хотя бы "Introduction To Algorithms", которая будет полезнее тыкания по википедии без знания предмета. Википедия хороша, когда знаешь, что искать. Да и не все статьи хорошего качества, поэтому надо еще уметь распознавать более-менее достоверную информацию.
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Sni4ok, Вы писали:
S>>Здравствуйте, tensor1982, Вы писали:
T>>>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
S>>такие вещи лучше отдельно ботать, вообще по плюсам довольно много хороших книг(страуструп, александревску, саттер, майерс и т.д), а по алгоритмам — лучше википедии(правда английской) ещё ничего не придумали.
_DA>Да ладно, есть хотя бы "Introduction To Algorithms", которая будет полезнее тыкания по википедии без знания предмета. Википедия хороша, когда знаешь, что искать. Да и не все статьи хорошего качества, поэтому надо еще уметь распознавать более-менее достоверную информацию.
Согласен, что на начальном этапе толковая книга полезнее разрозненных примеров. Я вначале решил взять наскоком – здесь _http://alglib.sources.ru/diffequations/eulerm.php изложен самый простой алгоритм решения обыкновенных дифференциальных уравнений методом Эйлера. Есть исходники на С++. Алгоритм мне понятен – в Matlab(е) это я быстро смогу реализовать даже не читая ничего про алгоритм, а так по остаточным знаниям. Но скачав коды на С++ я просто запутался – там во первых практически нет комментариев, во вторых незнакомый мне язык, в третьих – на С++ просто куча файлов в архиве.
О какой книге "Introduction To Algorithms" идет речь?! Я скачал «Cormen et al. Introduction to algorithms, 2 ed», но там ни слова на С++. В амазоне есть «Cormen et al. Introduction to Algorithms, Third Edition (2009)», но в аннотации и Reviews я не вижу ни слова о С++. Или где то можно скачать код?!
p.s. Бегло пролистав "Introduction To Algorithms" чувствую что книжка любопытная и скорее всего можно отнести к классике алгоритмов и положить в папочку рядышком с Кнутом. Так что даже если к ней нет кодов на С++ в любом случае – спасибо.
Здравствуйте, wander, Вы писали:
W>Я щас выражу только свое мнение, которое происходит из личного общения с программистами, у которых профиль — математика и которые пишут на С++. Их код ужасен с точки зрения С++, он небезопасен и плохо поддерживаем, но зато четко соответствует его математической подоплеке. Безусловно, если все пройдет хорошо, он работает быстро, но, увы, так почти никогда не бывает в больших проектах.
W>Поэтому, совет у меня такой, не зацикливайся на математике, если ты новичек в С++, то прежде всего нужно понять суть языка, концепцию в его заложенную, его дух. После этого математика, приложенная к этому знанию перестанет мешать тебе решать задачу грамотно в рамках языка, а наоборот, дополнит и выведет программирование на совершенно новый уровень.
W>Поэтому выкинь нафиг Шилдта. Лучше Лимпмана, Страуструпа, Саттера, Мейерса. И после изучения, ты найдешь как лучше применить математику, намного лучше, чем если поступать наоборот.
W>Все имхо.
Согласен, что библию и классиков прочесть рано или поздно надо будет. Но листая «Липпман. Основы программирования на C++» я не вижу ни одного примера работы с матрицами, ни одного решенного уравнения. Или имелась ввиду другая книга Липпмана? Книга Липпмана конечно гораздо интереснее чем Шилдт, но опять же боюсь что начну засыпать.
Кроме того когда вижу огромный список книг по С++, которые нужно прочесть вспоминаю слова Мао Цзэдуна «Чем больше книг я читал, тем больше глупел», «Много будешь читать — императором не станешь» и слова Кернигана «Единственный способ изучать новый язык программирования — писать на нем программы».
В любом случае даже если наберусь терпения и буду вначале упорно читать классиков, библию, а потом только программировать численные алгоритмы на С++ нужна толковая книга где описаны различные нюансы методов решения больших разряженных систем алгебраических уравнений, тонкости работы с матрицами, решение дифференциальных уравнений и уравнений в частных производных и особенности реализации этой лженауки на С++. А то получиться и у меня «код ужасеный с точки зрения С++».
Вот если бы меня спросил человек «какую литературу надо почитать что бы начать программировать на Matlab численные методы, прикоснуться к прикладной математике?», я бы несомненно рекомендовал для старта любой самоучитель/самомучитель, а затем «Метьюз. Численные методы MATLAB». В книге есть необходимое введение и необходимый минимум для знакомства с языком Matlab, а затем излагаются численные алгоритмы по методе – от простого к сложному и даются рабочие коды-листинги с подробными комментариями. Или книгу «Плохотников. Вычислительные методы. Теория и практика в среде MATLAB». Все что надо можно постичь за несколько недель-месяцев, в зависимости от интенсивности чтения.
А вот как я осваивал эти численные методы – раньше книг по Matlab в родном городе не продавали, интернета у меня практически не было, приходилось методом тыка и методом чтения на буржуазном и не понятном мне языке (англицком) смотреть help и делать простенькие примеры, потом читать книжку по прикладной математике, писать дырявый код на Matlab…так и мучился самоучкой несколько лет. Сейчас вижу что все это можно было бы постигнуть гораздо быстрее.
Конечно же язык С++ намного более сложен чем язык Matlab и в одной главе книги или в одной книге заложить необходимый минимум по С++ для работы с численными методами, алгоритмами, прикладной математикой, возможно и не получиться. Но все же на Fortran есть любопытные книжки по численному решению уравнений «Computational Physics-Fortran Version», «Fortran code for the book Computer simulation of liquids», «Numerical recipes in parallel Fortran». Кое что по этой теме на Fortran есть на русском, но на С++ что то подобные книги мне не встречались. Хотя мне казалось что С++ более распространен в наши дни.
Стоит ли читать «Седжвик Р. Фундаментальные алгоритмы на C++»?! Или там не показаны «плюсы» С++?
Здравствуйте, tensor1982, Вы писали:
T>Согласен, что на начальном этапе толковая книга полезнее разрозненных примеров. Я вначале решил взять наскоком – здесь _http://alglib.sources.ru/diffequations/eulerm.php изложен самый простой алгоритм решения обыкновенных дифференциальных уравнений методом Эйлера. Есть исходники на С++. Алгоритм мне понятен – в Matlab(е) это я быстро смогу реализовать даже не читая ничего про алгоритм, а так по остаточным знаниям. Но скачав коды на С++ я просто запутался – там во первых практически нет комментариев, во вторых незнакомый мне язык, в третьих – на С++ просто куча файлов в архиве.
T>О какой книге "Introduction To Algorithms" идет речь?! Я скачал «Cormen et al. Introduction to algorithms, 2 ed», но там ни слова на С++. В амазоне есть «Cormen et al. Introduction to Algorithms, Third Edition (2009)», но в аннотации и Reviews я не вижу ни слова о С++. Или где то можно скачать код?! T>p.s. Бегло пролистав "Introduction To Algorithms" чувствую что книжка любопытная и скорее всего можно отнести к классике алгоритмов и положить в папочку рядышком с Кнутом. Так что даже если к ней нет кодов на С++ в любом случае – спасибо.
Да, Кормен — это классика. У нас он переводился — на Озоне можно найти.
Если требуется изучать алгоритмы не численного характера, причем на С++, то нужно найти книжки
Роберта Сэджвика "Фундаментальные алгоритмы на С++". У него же есть и на С, и на Java.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, tensor1982, Вы писали:
T>Конечно же язык С++ намного более сложен чем язык Matlab и в одной главе книги или в одной книге заложить необходимый минимум по С++ для работы с численными методами, алгоритмами, прикладной математикой, возможно и не получиться. Но все же на Fortran есть любопытные книжки по численному решению уравнений «Computational Physics-Fortran Version», «Fortran code for the book Computer simulation of liquids», «Numerical recipes in parallel Fortran». Кое что по этой теме на Fortran есть на русском, но на С++ что то подобные книги мне не встречались. Хотя мне казалось что С++ более распространен в наши дни.
Ну не в той нише С++ обычно используют. Я сам когда-то численные методы на фортране изучал. Но С++ эту нишу как-то плохо занимает. Я ж говорю, на русском книжек по численным методам нет. T>Стоит ли читать «Седжвик Р. Фундаментальные алгоритмы на C++»?! Или там не показаны «плюсы» С++?
Там уже использование. Если ты С++ знаешь, то тебе показывают, как реализовать типовые динамические структуры данных и типовые алгоритмы на них: стеки, очереди, деревья, сортировки, поиск, графы, хеш-функции и т.д.
Но книжка написана хорошо.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, wander, Вы писали:
W>Я щас выражу только свое мнение, которое происходит из личного общения с программистами, у которых профиль — математика и которые пишут на С++. Их код ужасен с точки зрения С++, он небезопасен и плохо поддерживаем, но зато четко соответствует его математической подоплеке. Безусловно, если все пройдет хорошо, он работает быстро, но, увы, так почти никогда не бывает в больших проектах.
Думаю тут дело не в С++ вообще.
Мне тоже приходится постоянно работать с математиками, для которых Matlab — это основной инструмент.
Они и на Matlab'е фигово пишут
В том смысле, что этот код плохо структурирован, плохо читаем и тому подобное.
Т.е. этот код часто достаточно хорош для прототипов, проверки идей и алгоритмов,
но ужасен с точки зрения промышленного программирования.
В таком стиле будет одинаково фигово и на С/С++, и на С# и на вижуал бейсике.
Автору топика:
Учи просто программирование и не зацикливайся на С++.
Здравствуйте, bkat, Вы писали:
B>Мне тоже приходится постоянно работать с математиками, для которых Matlab — это основной инструмент. B>Они и на Matlab'е фигово пишут B>В том смысле, что этот код плохо структурирован, плохо читаем и тому подобное. B>Т.е. этот код часто достаточно хорош для прототипов, проверки идей и алгоритмов, B>но ужасен с точки зрения промышленного программирования. B>В таком стиле будет одинаково фигово и на С/С++, и на С# и на вижуал бейсике.
Я конечно не математик, а ближе к техническим дисциплинам, но мне приходилось работать программистом с многолетним практическим опытом, который говорил «ты мне главное напиши математическую формулы для оптимального управления техническим объектом и растолкуй алгоритм решения этих уравнений», а уж как реализовать это в «железе» и на каком языке, как написать надежный код – это дело техники. Поэтому для проверки идеи и использую Matlab или специализированные средства для математического моделирования. Кроме того иногда просто времени нет – идут эксперементальные данные, надо по быстрому набросать математическую модель, реализовать численный алгоритм решения и сопоставить данные расчета и данные эксперементальных опытов. Поэтому времени на толковое описание программы и оптимизацию кода просто не бывает.
Вот сейчас и решил постепенно подтянуть знания, пощупать С++. Поиграться с алгоритмами на этом языке.
Здравствуйте, LaptevVV, Вы писали: LVV>Ну не в той нише С++ обычно используют. Я сам когда-то численные методы на фортране изучал. Но С++ эту нишу как-то плохо занимает. Я ж говорю, на русском книжек по численным методам нет.
Если посмотреть на эту проблему шире опытным взглядом программиста — почему С++ не удалось занять нишу в этой области?! Еще не время или что-то другое?!
Здравствуйте, tensor1982, Вы писали:
T>Я конечно не математик, а ближе к техническим дисциплинам, но мне приходилось работать программистом с многолетним практическим опытом, который говорил «ты мне главное напиши математическую формулы для оптимального управления техническим объектом и растолкуй алгоритм решения этих уравнений», а уж как реализовать это в «железе» и на каком языке, как написать надежный код – это дело техники. Поэтому для проверки идеи и использую Matlab или специализированные средства для математического моделирования. Кроме того иногда просто времени нет – идут эксперементальные данные, надо по быстрому набросать математическую модель, реализовать численный алгоритм решения и сопоставить данные расчета и данные эксперементальных опытов. Поэтому времени на толковое описание программы и оптимизацию кода просто не бывает.
Ну ты собственно только подтвердил мои наблюдения.
Потому повторюсь, что нету особого смысла концентрироваться на С++,
а надо учиться писать в целом хороший код.
Метод на С++ с 20-ю параметрами на 1000 строк будет одинаково ужасен и на матлабе.
Глобальные структуры с 50-ю полями — это плохо на любом языке программирования
Именно подобные вещи характерны для кода на матлабе, с которым мне приходится сталкиваться.
Инкапсуляция мешает полету мысли настоящего матлаб-гуру
Здравствуйте, bkat, Вы писали: B>Автору топика: B>Учи просто программирование и не зацикливайся на С++.
Интересно, а как научиться программировать, не программируя на каком-нибудь серьезном языке?! В матлабе то можно пользоваться готовыми решениями и не особо заботиться о том сколько место в памяти занимает матрица и т.д. Правда, когда считаешь что-то очень большое – идут сообщения о переполнении памяти и тут уже потолок и т.д. Поэтому то и ищу замену Matlab. Кроме того велика вероятность того что С++ так или иначе понадобиться в дальнейшем.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте, LaptevVV, Вы писали: LVV>>Ну не в той нише С++ обычно используют. Я сам когда-то численные методы на фортране изучал. Но С++ эту нишу как-то плохо занимает. Я ж говорю, на русском книжек по численным методам нет. T>Если посмотреть на эту проблему шире опытным взглядом программиста — почему С++ не удалось занять нишу в этой области?! Еще не время или что-то другое?!
ИМХО фортран по-прежнему рулит очень хорошо...
Наработок в нем очень много.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте, LaptevVV, Вы писали: LVV>>Ну не в той нише С++ обычно используют. Я сам когда-то численные методы на фортране изучал. Но С++ эту нишу как-то плохо занимает. Я ж говорю, на русском книжек по численным методам нет. T>Если посмотреть на эту проблему шире опытным взглядом программиста — почему С++ не удалось занять нишу в этой области?! Еще не время или что-то другое?!
Просто язык сложный, и чтобы на нем грамотно реализовывать математику, нужно сперва освоить все тонкости синтаксиса, знать и уметь применять готовые решения, понимать зачем те или иные возможности есть в языке. Этого иногда слишком много для программиста, особенно, если сравнивать с языками, которые специально затачивались под математику. Многим моим знакомым математикам просто непонятно зачем знать все эти фокусы, о которых тут (на форуме) постоянно ведут беседы, когда намного проще забахать функцию на 50 параметров.
И естественно, если язык требует такой большой теоретической базы ему очень тяжело использоваться повсеместно с одинаковой легкостью. Особенно учитывая общую сложность (сам язык, плюс все прикладные области, требующиеся для решения задачи).
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Если цель стоит использовать возможности численных методов, то библиотеки Boost: http://www.boost.org/doc/libs содержат высокоуровневые функции, реализующие самые разные алгоритмы.
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
может всё-таки использовать языки с математическим уклоном? Почему именно С++?
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Все зависит от того, что собственно требуется. Если хочется просто изучить синтаксис языка, то любая книжка пойдет. Но ни в одной не будет какого-то подробного описания использования языка в контексте алгоритмов, так как с++ — язык общего назначения. Более того, считаю, что именно с++ мало годится для реализации алгоритмов в том смысле, что все его сила (классы, шаблоны и прочее) скорей всего не понадобятся для решения алгоритмических задач — вполне сойдет тот набор, что предоставляет собственно язык С, возможно с привлечением алгоритмов STL (в простейших случаях). Синтаксис знать нужно, чтобы хоть что-то написать, но этого мало. Надо понимать как это работает изнутри, во что компилятор преобразует те или иные конструкции языка, что такое стек, куча, выравнивание данных, разделяемые ресурсы (прошу прощения что свалил все эти термины в одну кучу), а для алгоритмистов особенно важно понимание численной арифметики, округления, переполнения и многое многое что связано с ограничениями вычислительной техники. Это в контексте тех высказываний, что код математиков "из ряда вон". Не знаю, есть ли ли что-то в книгах об этом, мне кажется это просто с опытом приходит.
А вот если говорить о реализации алгоритмов в рамках языка с++, да и любого другого, то было бы полезно ознакомиться с готовыми библиотеками, такими как LAPACK и их различными (реинкарнациями) расширениями, оптимизациями, как например интеловская MKL. Там много готовых базовых алгоритмов из линейной алгебры, FFT, sparse, заточенных под конкретное "железо".
Здравствуйте, tensor1982, Вы писали:
T>Здравствуйте! T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать. T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?! T>Спасибо!
Если бы по алгоритмам, то есть потрясающая книжка Седжвика "Фундаментальные алгоритмы на C++" в пяти томах.
А так -- ничего кроме фундаментального труда "Numerical Receipes in C" и в голову не идёт. Но он афаик не переведён. Зато там риальне ВСЁ. У вас как с английским?
Здравствуйте, Tilir, Вы писали: T>А так -- ничего кроме фундаментального труда "Numerical Receipes in C" и в голову не идёт. Но он афаик не переведён. Зато там риальне ВСЁ. У вас как с английским?
Порылся в гугле, действительно сейчас на русском наверное на С/С++ по численным методам нет. Хотя меня не оставляют надежды. Пока что попробую на eng. Что найду – размещу здесь в теме, вдруг кто-нибудь решит пойти такой же дорожкой и будет на С/С++ програмить численные методы. Пока что нашел по численным методам «William H. Press et al. Numerical Recipes The Art of Scientific Computing. Third Edition» (книжку с кодами для ознакомления можно найти через h**p://gen.lib.rus.ec).
Думаю что на eng по этой теме с реализацией на С/С++ полно можно будет найти. Только кроме С/С++ придется подучить и английский.
Здравствуйте, vvv104, Вы писали:
V>Все зависит от того, что собственно требуется. Если хочется просто изучить синтаксис языка, то любая книжка пойдет. Но ни в одной не будет какого-то подробного описания использования языка в контексте алгоритмов, так как с++ — язык общего назначения. Более того, считаю, что именно с++ мало годится для реализации алгоритмов в том смысле, что все его сила (классы, шаблоны и прочее) скорей всего не понадобятся для решения алгоритмических задач — вполне сойдет тот набор, что предоставляет собственно язык С, возможно с привлечением алгоритмов STL (в простейших случаях). Синтаксис знать нужно, чтобы хоть что-то написать, но этого мало. Надо понимать как это работает изнутри, во что компилятор преобразует те или иные конструкции языка, что такое стек, куча, выравнивание данных, разделяемые ресурсы (прошу прощения что свалил все эти термины в одну кучу), а для алгоритмистов особенно важно понимание численной арифметики, округления, переполнения и многое многое что связано с ограничениями вычислительной техники. Это в контексте тех высказываний, что код математиков "из ряда вон". Не знаю, есть ли ли что-то в книгах об этом, мне кажется это просто с опытом приходит.
Вот-вот, именно это мне и надо! Округления, переполнение, погрешности при решении уравнений и т.д. А еще где почитать о компиляторе? Сейчас мучаюсь с выбором книжки №2 по С++. Как более продуктивно работать со второй книжкой по С++ и тщательно обдумывая прорабатывать примеры?
Я установил первое, что попалось под руку — Microsoft Visual Studio 2005. Работаю с консолью. Но я не понимаю как использовать его на полную мощь при отладке.
Когда программировал на Matlab(е) — хотя бы видел при отладке программы в workspace сколько памяти у меня занимает матрица, мог свободно посмотреть какое число и на каком этапе у меня записывается в матрицу. То же самое и со структурами. Но в Matlab нет никакого компилятора – жми run, все само собой работает. Хотя как то давно с помощью встроенных в Matlab инструментов и какого то не матлабовского компилятора как то бездумно компилировал свои функции — выполнение функций в большинстве случаев в секундах становилось быстрее. Но все это было от меня скрыто и не понятно. Я всего лишь набирал команду, сообщал имя функции которую надо откомпелировать, а потом появлялись в папочке какие то файлы с неизвестными мне расширениями. И вызов функции уже происходил из этой папки.
Совсем немного давно пытался програмить на С микроконтроллеры фирмы Atmel — чисто для расширения кругозора сделал бездумно несколько готовых примеров, до изучения библии K&R руки не дошли. При отладке программы на бесплатном компиляторе WinAVR GCC я видел на каждом шаге что происходит с памятью, какие данные записаны в регистре, что на портах микроконтроллера. Мог в любой момент ткнуть мышью в порт и сменить 1 на 0 (т.е. проимитировать смену напряжения с 5 Вольт на 0 Вольт на порту контроллера) и посмотреть что будет на следующем шаге.
Ничего подобного в Visual Studio я не нахожу (не нахожу методом научного тыка) ни для работы с матрицами, ни для просмотра памяти или не понимаю, как отлаживать программу обдуманно.
Наверное книжкой №2 попробую «Седжвик Р. Фундаментальные алгоритмы на C++» — там хотя бы задачки интересные. Только не знаю хватит ли знаний языка (после Шилдта). Все таки к чтению библии Страуструпа и классиков С++ я еще не готов. Да и нет времени, так как программирование на С++ это пока что всего лишь хобби.
Эллочка Людоедка из Ильфа&Петрова знала всего 30ть слов, но могла выражать практически любую свою мысль. Но говорила ли Эллочка Людоедка на русском?! Не мешал ли ей мыслить столь скудный языковой запас?!
Я хочу на С++, познать необходимый мне минимум (основы, матрицы и циклы с примерами решения алгебраических уравнений, алгоритмы и т.д.) без чтения библии и классиков С++, а потом уже по ходу освоить тонкости языка.
V>А вот если говорить о реализации алгоритмов в рамках языка с++, да и любого другого, то было бы полезно ознакомиться с готовыми библиотеками, такими как LAPACK и их различными (реинкарнациями) расширениями, оптимизациями, как например интеловская MKL. Там много готовых базовых алгоритмов из линейной алгебры, FFT, sparse, заточенных под конкретное "железо".
Спасибо за подсказку! Как-нибудь после основ С/С++ поищу.
Здравствуйте, tensor1982, Вы писали:
T>Ничего подобного в Visual Studio я не нахожу (не нахожу методом научного тыка) ни для работы с матрицами, ни для просмотра памяти или не понимаю, как отлаживать программу обдуманно.
Недавно вышла вот такая книжка по среде Visual Studio 2008 http://www.ozon.ru/context/detail/id/4385452/
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
1) IMHO, тебе не надо вообще с матлабы уходить. Хорошо же всё! А для "расширения кругозора" лучше двигаться в двух независимых направлениях
Направление 1 -- алгоритмы. Тут язык не важен, а важны сосбтвенно алгоритмы и струтктуры данных. Берёшь любой язык, какой тебе просто будет освоить. C#, C, PASCAL, FORTRAN. В принципе это не важно который. И ботаешь учебник по алгоритмам с этим я\зыком наперевес
Направление 2 -- представление о том, как работает программа на компьютере. Тут конечно можно поизучать асмы и архитектуры разных машин, но, IMHO, это следующая стадия, тебе пока не нужная. А нужная -- это С.
Сила С в том и состоит, что это С предоставляет программисту возможность писать для компа вполне так переносимые программы, и при этом иметь доступ к тому, как оно на самом низком уровне работает. То есть С предоставляет программисту некий обобщённый взгляд на компьютер, которые при этом не скрывает большинства низкоуровневых деталей.
Для изучения этого, IMHO, ничего кроме K&R нету...
А уж если заботаешь как на компе работает С-программа и сам по себе С, с одной стороны, и выч. алгоритмы сами по себе, с другой, сможешь писать и на с++ вычматематические проги...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, wander, Вы писали:
W>Я щас выражу только свое мнение, которое происходит из личного общения с программистами, у которых профиль — математика и которые пишут на С++. Их код ужасен с точки зрения С++, он небезопасен и плохо поддерживаем, но зато четко соответствует его математической подоплеке. Безусловно, если все пройдет хорошо, он работает быстро, но, увы, так почти никогда не бывает в больших проектах.
Я присоединюсь. У меня вообще есть такое наблюдение, что в большинстве своём математики плохие программисты.
Я не знаю с чем это связано, но обычно, на практикте, так сказать, математики пишут слишком обобщённый и переусложнённый код, которые не особенно хорошо решает поставленную практическую задачу...
При этом вроде бы люди крайне неглупые и вменяемые, но вот что-то не так в самой системе ценностей. Похоже у хорошего программиста и хорошего математика должны быть в чём-то диаметрально-противоположенные взгляды на мир.
Тоже всё IMHO, и совсем без желания обидеть...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Похоже у хорошего программиста и хорошего математика должны быть в чём-то диаметрально-противоположенные взгляды на мир.
Думаю все проще. У многих из них просто никогда не было цели писать промышленный код
и потому они пишут на уровне студента первокурсников.
Точно так же пишут железячники, физики и многие другие для которых код сам по себе не имеет ценности.
Ты когда-нибудь видел математика, который бы обсуждал с другим математиком
как лучше структурировать код на матлабе чтобы быть готовым к новым требованиям?
Они эти проблемы даже и не обсуждают или делают это на любительском уровне.
А если математик попадает в среду программистов, то все становится на свои места,
ибо они, как ты верно подметил, не дураки.
. Она маленькая, но толковая, позволит быстро научится пользоваться языком, а потом можно Сэдвжика читать, или перестать обращать внимание на язык программирование про чтение мат.книжек
Здравствуйте, tensor1982, Вы писали:
T>... Поэтому для проверки идеи и использую Matlab или специализированные средства для математического моделирования. Кроме того иногда просто времени нет – идут эксперементальные данные, надо по быстрому набросать математическую модель, реализовать численный алгоритм решения и сопоставить данные расчета и данные эксперементальных опытов. Поэтому времени на толковое описание программы и оптимизацию кода просто не бывает. T>Вот сейчас и решил постепенно подтянуть знания, пощупать С++. Поиграться с алгоритмами на этом языке.
Честно говоря не понял, зачем тебе C++. Ты думаешь когда-нибудь появится время на "толковое описание программы и оптимизацию кода"? C++ однозначно хуже Матлаба для быстрого программирования. По крайней мере пока не набьешь руку и не освоишь библиотек своей области.
Здравствуйте, tensor1982, Вы писали:
T>Ранее программировал на Matlab. Сейчас надо С++. Для старта в С++ почитал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих». Очень скучно, примеры тривиальные – но с чего-то же надо начинать.
Шилдыта — в печку, сразу не раздумывая! Великий профессиональный профанатор! Вы хотите, чтобы Вас держали за идиота?
T>Есть ли что-нибудь серьезное на С++ с уклоном на алгоритмы, прикладную математику, работу с матрицами, численные методы, решение уравнений, обыкновенные дифференциальные уравнения и т.д.?!
Ну, с учетом того, что матан знаете, надо просто брать некий справочник по C++ и набивать руку. Напишите для начала класс Complex самостоятельно. Всякие Boostы по началу тоже лучше не трогать — редкостная помойка. И вообще, все зависит от задачи — если нужны просто пограммы, запускаемые из командной строки, то это одно, а если оконные свистелки, то совсем другое — тут уже не C++, а библиотеки, которые по сложности и идиотизмам могут быть гораздо хуже самого C++. Но вообще-то, для числодробительных расчетов лучше подходит Фортран, С++ сливает.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Собственно, чего это я приходил-то, может сказать чего хотел? А, ну да — Алан Голуб, Веревка достаточной длины, чтобы прострелить себе ногу. Книжка такая. http://proklondike.com/books/cpp/allen_golub_rules.html
Настоятельно рекомендуется всем начинающим и не только. И не только про C++.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
. Она маленькая, но толковая, позволит быстро научится пользоваться языком, а потом можно Сэдвжика читать, или перестать обращать внимание на язык программирование про чтение мат.книжек
в аннотации к книге №2 из серии C++ In-Depth «Кениг. Эффективное программирование на C++» высказывается мнение что «Естественней бы нумерацию с Липпманом поменять, так как это (Кениг) — действительно первая книга по С++».
Где взять тексты программ на С++ рассмотренных в книге?! В книге приведены две ссылки для скачивания но оба сайта уже не существуют. Поиск гуглем по запросу «Llippman Essential C++ code» тоже ничего толкового не дает.
Здравствуйте, Mazay, Вы писали:
M>Честно говоря не понял, зачем тебе C++. Ты думаешь когда-нибудь появится время на "толковое описание программы и оптимизацию кода"? C++ однозначно хуже Матлаба для быстрого программирования. По крайней мере пока не набьешь руку и не освоишь библиотек своей области.
Если в вкратце, то часто надо рассчитывать различные электротехнологические установки на основе численных методов (математическое моделирование, метод конечных элементов, метод конечных разностей и другие численные методы). Многое считаю используя связку Matlab и специализированный пакет для матмоделирования COMSOL Multiphysics. Но все чаще упираюсь в потолок – то алгоритм решения нелинейных уравнений разработчиками написан дыряво, то идет переполнение памяти (матрица не влазит) при решении задач большой размерности и т.д. Постоянно приходиться плясать с бубном и как то латать дыры. Вот и подумал что надо постепенно, не торопясь, в качестве хобби, нестандартные математические модели рассчитывать/писать на каком-нибудь серьезном языке. Численные методы в основном все на Fortran реализованы. Низнаю с чем это связанно – с тем что на Fortran быстрее создавать приложения или с какими-то ограничениями С++.
В описании на озон.ру к книги «Рыжиков. Современный Фортран» высказывается мнение:
«Автор данного учебника — опытный программист и преподаватель, заслуженный деятель науки РФ. Книга представляет собой апологию современного Фортрана. Автор убедительно доказывает, что лучший язык программирования нестандартных вычислений — это Фортран». Книгу Рыжикова Ю. И. найти в сети не могу, поэтому не знаю аргументации и «убедительного доказательства».
Но я вижу две книги «Langtangen, Computational Partial Differential Equations, Numerical Methods and Diffpack Programming» и «Langtangen, Tveito. Advanced Topics in Computational Partial Differential Equations: Numerical Methods and Diffpack Programming». Вижу какие нестандартные расчеты делали авторы этих книг. Вижу универсальный подход авторов к решению различных задач матмоделирования. Там все на С++, поэтому то и делаю ставку на С++.
Естественно самостоятельно взвесить все плюсы и минусы С++ и Fortran, провести сравнительный анализ этих языков в приложении к задачам математического моделирования и численным методам не могу.
Здравствуйте, tensor1982, Вы писали:
M>>Честно говоря не понял, зачем тебе C++. Ты думаешь когда-нибудь появится время на "толковое описание программы и оптимизацию кода"? C++ однозначно хуже Матлаба для быстрого программирования. По крайней мере пока не набьешь руку и не освоишь библиотек своей области.
T>Если в вкратце, то часто надо рассчитывать различные электротехнологические установки на основе численных методов (математическое моделирование, метод конечных элементов, метод конечных разностей и другие численные методы). Многое считаю используя связку Matlab и специализированный пакет для матмоделирования COMSOL Multiphysics. Но все чаще упираюсь в потолок – то алгоритм решения нелинейных уравнений разработчиками написан дыряво, то идет переполнение памяти (матрица не влазит) при решении задач большой размерности и т.д. Постоянно приходиться плясать с бубном и как то латать дыры. Вот и подумал что надо постепенно, не торопясь, в качестве хобби, нестандартные математические модели рассчитывать/писать на каком-нибудь серьезном языке. Численные методы в основном все на Fortran реализованы. Низнаю с чем это связанно – с тем что на Fortran быстрее создавать приложения или с какими-то ограничениями С++.
Позволю себе вставить пару слов, хоть мои матрицы пока и влазят в память, а считаю я вообще на C#
Присоединюсь к Mazay в его вопросе, зачем вам вообще нужен С++? Ваша специализация — вычисления, а не программирование, вам нужно в первую очередь эффективнее посчитать, а не отвлекаться на то, чтобы заставить компьютер выполнять то, что вам нужно. Вы сами обозначили свои проблемы: во-первых, вас смущает качество вашего кода и необходимость плясать с бубном для залатывания дыр, и во-вторых, объёмы ваших данных настолько велики, что наивное распределение памяти в вашем случае не работает и простые алгоритмы становится невозможно применять.
Что касается первой проблемы, то С++, к сожалению, только увеличит количество мест, в которых вам придётся плясать с бубном. От необходимости периодического затыкания дыр вас тоже не избавит ни один язык программирования — это вопрос опыта и культуры программирования. Некоторые проблемы только так и нужно решать, потому как "красивое" и "правильное" решение может отнять слишком много времени.
А вот повысить свои представления о программировании и о том, что происходит за сценой — можно и нужно. Но опять же, для этого можно выбрать и другой язык, в котором будет меньше условностей, например C#, Python, Java. С другой стороны, численные вычисления популярно делать именно на троице С/С++/Fortran, на указанных мной языках мало кто делает расчёты и это может быть для вас критично.
По поводу второй. Для того, чтобы С++ вам помог в решении этой проблемы, вам понадобится найти готовую библиотеку для работы с огромными матрицами. Если она есть и надёжно работает, то всё хорошо, вы в выигрыше. Если же её нет (или она есть, но сильно платная), то вы оказываетесь в такой же ситуации, в какой оказались с матлабом. Что вам мешает сразу решать эту проблему в рамках Матлаба? Проблема-то переходит в разряд алгоритмических, для решения которых Матлаб содержит достаточно средств.
В качестве итога хотелось бы посоветовать не "изучать С++", а "находить решения своих проблем", и помнить, что эти самые решения совершенно необязательно будут связаны с С++.
Здравствуйте, tensor1982, Вы писали:
T>Естественно самостоятельно взвесить все плюсы и минусы С++ и Fortran, провести сравнительный анализ этих языков в приложении к задачам математического моделирования и численным методам не могу.
Вычматы уже много лет живут на FORTRAN, и они притёрлись друг к другу!
Но если тебе надо что-то совсем необычное, графы какие-нибудь в необычном представлении привинтить, очень сложные адаптивные сетки и т. п., то тут уже С выходит вперёд.
В FORTRAN большой плюс то, что там нет ничего лишнего. Зато при совсем нестандартной задаче чего-то может не хватать.
А в С++ наоборот, слишком много лишнего для любой задачи.
Насколько я тебя понял, функциональщина и прочее шаблоноверчение тебя не интересуют, поэтому изучай не С++, а С.
Просто так изучи С, вне связи с вычматами, или в связи. Не суть важно. По крайней мере K&R прочитай и осмысли. А ещё лучше осмысли при помощи написания маленьких программ.
А потом бери С++ и изучай его не в сторону ООП или функционального языка, а в сторону улучшенного С. Ну там с контролем типов, с контейнерами, с автоматизацией заботы об освобождении больше неиспользуемой памяти (это обычно и называют хитрым словом RAII) и т. д...
Так правда намного прямее получится. Кроме того на С проще научиться писать эффективные программы. В С++ и так просто довольно заблудиться, а пересаживаясь с матлаба, и почти неизбежно, IMHO...
С -- это подмножество С++. При этом это практически то самое подмножество, которое нужно тебе. К нему надо потом будет ещё добавить стандартную или какую-то ещё другую библиотеку и всё.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Хитрик Денис, Вы писали:
ХД>Для того, чтобы С++ вам помог в решении этой проблемы, вам понадобится найти готовую библиотеку для работы с огромными матрицами. Если она есть и надёжно работает, то всё хорошо, вы в выигрыше. Если же её нет (или она есть, но сильно платная), то вы оказываетесь в такой же ситуации, в какой оказались с матлабом.
Вроде бы есть такая библиотека на С++ www.diffpack.com и судя по всему вполне по карману – только не щупал я её. И книг Langtangen по diffpack я еще не прочитал, так их нет в сети. Буду заказывать с амазона и ждать. А пока что в свободное время поучу С++. В книге все приложения с кодами на С++.
ХД>Что вам мешает сразу решать эту проблему в рамках Матлаба? Проблема-то переходит в разряд алгоритмических, для решения которых Матлаб содержит достаточно средств.
Я раньше так и делал – решал самоучкой одну частную проблему в рамках Matlab. Но это очень трудно все самому делать с нуля. Кроме того трехмерный объекты довольно таки трудоемко рассчитывать с помощью Matlab(а) на основе метода конечных элементов. Это же надо вначале строить геометрию конструкции, потом генерировать расчетную сетку, потом закладывать уравнения модели и строить алгоритмы их решения.
Нужен универсальный инструмент для решения задач матмоделирования такой как Comsol, но только не такой дырявый и с открытым кодом что бы в случае чего можно было дописать свои уравнения, создать свою математическую модель, подключить какой-нибудь надежный алгоритм решения уравнений и все это решить.
«Diffpack является объектно-ориентированным окружением, работающим под С++, предназначенным для решения дифференциальных уравнений в частных производных. Он представляет собой совокупность текстов программ, написанных на языке C++, и библиотек, соответствующих основным принципам объектно-ориентированного программирования, которые позволяют с минимальными затратами времени создавать консольные приложения или приложения Windows для решения уравнения или системы уравнений в частных производных.
Diffpack реализует новый подход к решения задач математической физики и обеспечивает выход на новый уровень моделирования. Структура Diffpack, позволяющая пользователю самому задавать решаемое уравнение или систему дифференциальных уравнений в частных производных, обеспечивает высокую гибкость его использования.»
Вот и делаю ставку на библиотеки diffpack, а до этого мне надо с С++ разобраться, особенно с той частью С++ которая мне нужна с учетом специфики задачи.
. Она маленькая, но толковая, позволит быстро научится пользоваться языком, а потом можно Сэдвжика читать, или перестать обращать внимание на язык программирование про чтение мат.книжек
T>Здесь http://www.rsdn.ru/res/book/cpp/Kenig-mu.xml
в аннотации к книге №2 из серии C++ In-Depth «Кениг. Эффективное программирование на C++» высказывается мнение что «Естественней бы нумерацию с Липпманом поменять, так как это (Кениг) — действительно первая книга по С++». T>Где взять тексты программ на С++ рассмотренных в книге?! В книге приведены две ссылки для скачивания но оба сайта уже не существуют. Поиск гуглем по запросу «Llippman Essential C++ code» тоже ничего толкового не дает.
Не знаю насчет изменения нумерации, но книга Essential C++ рассчитана на уже программистов, незнающих С++. ИМХО если вы писали, пусть даже в матлабе, то стоит прочитать именно ее, а потом решать разные "интересные" задачки, заглядывая в Страуструпа. Мне кажется вам будет так проще и интереснее изучать С++. А Кёниг или C++ Primier Липпмана — это такие талмуды по 1к+ страниц.
З.Ы. А ссылки на код в книге вполне рабочие, вот сюда переадресовывает, где все прекрасно скачивается — проверил.
Наврал я вам про Кёнига , перепутал наверно с кем-то, действительно очень хорошая книга и читается очень интересно и небольшая. Можно и ее вместо Липпмана, по-моему они конкурируют, а не дополняют друг друга
Здравствуйте, 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 на шею