Здравствуйте, 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к+ страниц.
З.Ы. А ссылки на код в книге вполне рабочие, вот сюда переадресовывает, где все прекрасно скачивается — проверил.
Наврал я вам про Кёнига , перепутал наверно с кем-то, действительно очень хорошая книга и читается очень интересно и небольшая. Можно и ее вместо Липпмана, по-моему они конкурируют, а не дополняют друг друга