2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Изучение С++ с уклоном на численные методы
Сообщение30.11.2009, 12:41 


02/09/06
33
Здравствуйте!
Необходимо изучить и понять пролетарскую суть С++ и научиться писать программы ориентированные на математическое моделирование, численные методы решения уравнений в частных производных (метод конечных разностей, метод конечных элементов), решение алгебраических уравнений большой размерности, разряженные матрицы и т.д.
Раньше двухмерные задачи (теплопередача, электромагнетизм) делал в Matlab на основе метода контрольного объема (по Патанкару) и на основе метода конечных разностей.
Более сложные задачи на основе метода конечных элементов решал специализированном пакете для математического моделирования COMSOL Multiphysics.

Для старта в С++ полистал первое что попалось под руку «Шилдт Г. C++ Руководство для начинающих. 2005». Очень скучно – но с чего-то же надо начинать. Что читать дальше и в какой последовательности что бы почуять С++ и особенно ту часть С++, которая нужна будет при освоении численных методов? Какие книжки должен прочесть каждый пишущий на С++?!

Люблю книжки с нетривиальными примерами – так лучше в память заходит и не скучно читать. Почти все, что изложено в книге «Метьюз. Численные методы MATLAB» мне понятно. Хотелось бы такую же книгу на С++, что бы более детально познакомиться с языком С++ и в то же время не скучать.
Стоит ли читать «Седжвик Р. Фундаментальные алгоритмы на C++»?! Или там не показаны «плюсы» С++?
Перед тем как читать книгу «William H. Press et al. Numerical Recipes The Art of Scientific Computing. Third Edition» - какие книги надо пролистать по С++, что бы не испытывать проблем с языком С++, при выполнении этих примеров?
Есть ли еще что-нибудь серьезное на С++ с уклоном на математические алгоритмы, численные методы, решение уравнений в частных производных, обыкновенные дифференциальные уравнения, работу с матрицами и т.д.?! Есть ли по этой теме что-нибудь на русском или только на английском?
На Fortran есть любопытные книжки по численному решению уравнений «Computational Physics-Fortran Version», «Fortran code for the book Computer simulation of liquids», «Numerical recipes in parallel Fortran», кое что на русском, но на С++ что то подобные книги мне не встречались.

Спасибо за внимание!

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение03.12.2009, 09:40 


04/02/08
325
Буково
fuzzy2006 в сообщении #266710 писал(а):
Есть ли еще что-нибудь серьезное на С++ с уклоном на математические алгоритмы, численные методы, решение уравнений в частных производных, обыкновенные дифференциальные уравнения, работу с матрицами и т.д.?! Есть ли по этой теме что-нибудь на русском или только на английском?

Честно говоря, сколько уже работаю с численными методами (в основном, обработка изображений), никогда не видел нужны в С++. Под С хватает разных математических библиотек, и если вам не нужно писать проект на несколько сот страниц кода, ИМХО, С++ не нужен.
С другой стороны, при работе с матрицами мощь С++ может оказаться полезной для введения классов векторов и матриц, перегрузки арифметических операторов и т.п. Есть у меня книжка "астрономия на ПК", так в ней для краткости изложения все примеры на С++.
А вам, думаю, действительно полезно будет почитать "Numerical Recipes", а до этого, для понимания основ С++ - хотя бы того же Лафоре (Страуструпа сразу читать не советую - уж больно много информации на вас свалится, а вот после Лафоре - можно).

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение03.12.2009, 10:01 


02/09/06
33
Не могу найти в сети «астрономию на пк». Но нашел « Astronomy on the Personal Computer et al. Astronomy on the Personal Computer. 2nd Edition ». Правда книга старая (94 год) и код там на не С++. Но задачки интересные вроде бы. Это эта книга, но "переписанная" на С++?

Книги с уклоном на математику, матрицы, численные методы по чистому С для начала думаю будут тоже полезны.

В будущем вероятно что чистого С может и не хватить.
Уточняю суть проблемы и интерес к С++. Часто надо рассчитывать различные электротехнологические установки на основе численных методов (математическое моделирование, метод конечных элементов, метод конечных разностей и другие численные методы). Многое считаю используя связку Matlab и специализированный пакет для матмоделирования COMSOL Multiphysics. Но все чаще упираюсь в потолок – то алгоритм решения нелинейных уравнений разработчиками написан дыряво, то идет переполнение памяти (матрица не влазит) при решении задач большой размерности, то не могу заложить нестандартную математическую модель в COMSOL и т.д. Постоянно приходиться плясать с бубном и как то латать дыры. Вот и подумал что надо постепенно, не торопясь, в качестве хобби, нестандартные математические модели рассчитывать/писать на каком-нибудь серьезном языке. Численные методы в основном все на 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, провести сравнительный анализ этих языков в приложении к задачам математического моделирования и численным методам не могу.

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение03.12.2009, 10:38 


04/02/08
325
Буково
Цитата:
Но нашел « Astronomy on the Personal Computer et al. Astronomy on the Personal Computer. 2nd Edition ». Правда книга старая (94 год) и код там на не С++.
Но задачки интересные вроде бы. Это эта книга, но "переписанная" на С++?

Она. Только перевод более позднего издания (на С++, к книге прилагался диск с исходниками).

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 00:15 


17/01/09
119
fuzzy2006 в сообщении #267656 писал(а):
Вот и подумал что надо постепенно, не торопясь, в качестве хобби, нестандартные математические модели рассчитывать/писать на каком-нибудь серьезном языке.

Это правильно, но, как уже писали выше, C++ для этого - язык неподходящий. Очень сложный и откровенно перегруженный возможностями, ненужными для решения задач такого рода.

Если хочется что-то похожее на C++, то лучше писать на чистом C. Разницы с точки зрения вида кода почти не будет, но качество компиляторов для вычислительных задач - выше.

А еще лучше пользоваться Фортраном. Во-первых, производительность кода максимальна, во-вторых, язык предназначен именно для вычислительных задач (много мощных встроенных языковых средств, программы лучше читаются и, как следствие, поддерживаются).

fuzzy2006 в сообщении #267656 писал(а):
Численные методы в основном все на Fortran реализованы. Низнаю с чем это связанно – с тем что на Fortran быстрее создавать приложения или с какими-то ограничениями С++.

И то, и другое. Конечно, принципиально на C++ можно написать все, что угодно, но вот сколько времени займет написание и, главное, отладка...

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 01:24 


06/04/09
156
Воронеж
Что можно такое написать на Фортране, что займет значительно больше времени в С++?
И какие проблемы с отладкой?

-- Сб дек 05, 2009 01:26:01 --

Фантом в сообщении #268070 писал(а):
и другое.

Какие же ограничения С++ мешают на нем писать математику?

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 02:03 


17/01/09
119
p51x в сообщении #268083 писал(а):
Что можно такое написать на Фортране, что займет значительно больше времени в С++?

Напишите, например, банальный метод Гаусса. Скорость счета будет сравнимой, а вот скорость написания...

p51x в сообщении #268083 писал(а):
Какие же ограничения С++ мешают на нем писать математику?

Ну, например, отсутствие инструментария для работы с матрицами. Его, конечно, можно написать и самому - но смысл?

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 10:48 


06/04/09
156
Воронеж
Фантом в сообщении #268090 писал(а):
а вот скорость написания...

Написал минут за 10 со всеми проверками... и с чаем.

Фантом в сообщении #268090 писал(а):
отсутствие инструментария для работы с матрицами

А подробнее?

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 11:15 
Заслуженный участник


19/07/08
1266
Фантом в сообщении #268070 писал(а):
А еще лучше пользоваться Фортраном. Во-первых, производительность кода максимальна
Ну, по этому пункту неправда ваша. Уже лет 10 как никакой разницы.
Говорят, правда, фортран паралелится проще. Но обычная скорость выполнения уже давно одинакова.

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение05.12.2009, 22:46 


17/01/09
119
p51x в сообщении #268116 писал(а):
Написал минут за 10 со всеми проверками... и с чаем.

Результат покажете?

p51x в сообщении #268116 писал(а):
А подробнее?

А Вы Фортран знаете? Если да - подробности и так известны. Если нет - о чем мы спорим?

nestoklon в сообщении #268118 писал(а):
Ну, по этому пункту неправда ваша. Уже лет 10 как никакой разницы.

Ну, ссылаться на личный опыт немного моветон, поэтому посмотрите, например, тут: http://www.cs.rpi.edu/~szymansk/OOF90/performance.html.

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение06.12.2009, 00:06 
Заслуженный участник


09/08/09
3438
С.Петербург
Фантом в сообщении #268282 писал(а):
nestoklon в сообщении #268118 писал(а):
Ну, по этому пункту неправда ваша. Уже лет 10 как никакой разницы.

Ну, ссылаться на личный опыт немного моветон, поэтому посмотрите, например, тут: http://www.cs.rpi.edu/~szymansk/OOF90/performance.html.
Судя по всему, это данные более чем 10-летней давности: последний из используемых источников "To appear in Proc. Eighth SIAM Conference on Parallel Processsing for Scientific Computing, March 14-17, 1997".
Кстати, RS6000 уже 10 лет как не производится.

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение06.12.2009, 00:31 


17/01/09
119
Maslov в сообщении #268304 писал(а):
Судя по всему, это данные более чем 10-летней давности: последний из используемых источников "To appear in Proc. Eighth SIAM Conference on Parallel Processsing for Scientific Computing, March 14-17, 1997".

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

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение06.12.2009, 03:06 
Заслуженный участник


26/07/09
1559
Алматы
2fuzzy2006
Попробуйте полазить по oonumerics.org.

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение06.12.2009, 12:23 
Заслуженный участник


19/07/08
1266
Фантом в сообщении #268282 писал(а):
поэтому посмотрите, например, тут: http://www.cs.rpi.edu/~szymansk/OOF90/performance.html.
http://shootout.alioth.debian.org/u32/fortran.php

 Профиль  
                  
 
 Re: Изучение С++ с уклоном на численные методы
Сообщение06.12.2009, 16:56 


17/01/09
119
nestoklon в сообщении #268391 писал(а):
http://shootout.alioth.debian.org/u32/fortran.php

Я же писал про "достаточно хорошее сравнение". :D А там этим явно занимались люди, не знающие того, что они сравнивали. Вот, чтобы далеко не ходить, возьмем первый же тест (N-body) на Фортране, первую же процедуру из него:
Код:
  subroutine offsetMomentum(k, bodies)
    integer, intent(in) :: k
    type(body), dimension(:), intent(inout) :: bodies
    real*8 :: px, py, pz
    px = 0.0d0
    py = 0.0d0
    pz = 0.0d0
    do i=1,size(bodies)
       px = px + bodies(i)%vx * bodies(i)%mass;
       py = py + bodies(i)%vy * bodies(i)%mass;
       pz = pz + bodies(i)%vz * bodies(i)%mass;
    end do
    bodies(k)%vx = -px/SOLAR_MASS
    bodies(k)%vy = -py/SOLAR_MASS
    bodies(k)%vz = -pz/SOLAR_MASS
  end subroutine offsetMomentum

Это не программа на Фортране. Это "подстрочный перевод" программы на C++ на Фортран, не использующий кучу возможностей последнего.

Во-первых, совершенно незачем было возиться с записями. Долго, неэффективно, а в данной конкретной задаче еще и неудобно. При нормальной схеме хранения данных эта процедура будет иметь такой вид:
Код:
  subroutine offsetMomentum(k, N, mass, velocs)
    integer, intent(in) :: k,N                                      !  номер тела и общее количество
    real(8), dimension(1:N), intent(in) :: mass             ! отдельно массы
    real(8), dimension(1:3,1:N), intent(inout) :: velocs  ! отдельно скорости

    velocs(:,k)=-matmul(velocs,mass)/SOLAR_MASS
  end subroutine offsetMomentum


Все. Содержательная часть состоит из одной строки. Причем очевидно, что в нормальном коде эта процедура вообще не нужна (она там вызывается один раз с одним значением параметра k), так что эту строку проще сразу вставить вместо вызова процедуры. Получившийся "код" (из одной строки :D ) заметно лучше воспринимается, поскольку это попросту переписывание математической модели "один к одному". Остальную часть программы перелопачивать лень, но, думаю, очевидно, что и там все сворачивается примерно таким же образом.

При этом самое важное, что такая конструкция при больших N (при маленьких, понятно, все равно, но это и неинтересно - слишком мал объем вычислений) будет работать заметно быстрее, чем реализованный авторами тестируемых программ тривиальный вариант матричного умножения. А для достижения аналогичной производительности на C++ придется написать сравнительно большую реализацию какой-то более быстрой схемы умножения (потратив на это заметно больше времени).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group