2014 dxdy logo

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

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




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней. На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13  След.
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 01:45 
Аватара пользователя


30/07/10
254

(Оффтоп)

venco, Читайте внимательней. Я не понимаю какого объяснения Вы хотите. Почитайте вот здесь сообщении #417060 ещё.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 01:49 
Заслуженный участник


09/08/09
3438
С.Петербург
cupuyc в сообщении #418170 писал(а):
читайте внимательней
Там читать особенно нечего. Пример с интегралом Вы же не написали.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 01:50 
Аватара пользователя


30/07/10
254

(Оффтоп)

Maslov, написал. Жду когда nestoklon закончит.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 01:56 
Заслуженный участник


09/08/09
3438
С.Петербург

(Оффтоп)

cupuyc в сообщении #418174 писал(а):
Maslov, написал. Жду когда nestoklon закончит.
Может быть, не дожидаясь nestoklon'а опубликуете?

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 03:35 
Заслуженный участник
Аватара пользователя


30/01/06
72407
cupuyc в сообщении #418125 писал(а):
Почитайте что говорит сам Страуструп про С++.

Читал. Ничего общего с вашими заявлениями.

Maslov в сообщении #418132 писал(а):
На самом деле, это как посмотреть. На мой взгляд, такие вещи как - перегрузка операторов- a->b вместо (*a).b - <cond> ? <trueVal> : <falseVal>вполне себе подпадают под понятие синтаксического сахара.

Угу. Но многим этого не хватает, или само кажется уродливым, или просто нерелевантно по сравнению со многими другими аспектами языка. Впрочем, это ответвление разговора само по себе, похоже, нерелевантно.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 05:22 
Аватара пользователя


30/07/10
254

(Оффтоп)

Munin в сообщении #418196 писал(а):
Читал. Ничего общего с вашими заявлениями.
Ну-ну. Спорить и доказывать ничего не буду. Открою тему в программировании где перечислю все косяки С++.


Собственно вот сорец.
код: [ скачать ] [ спрятать ]
Используется синтаксис Erlang
-module(integral).
-export([simpson/4, simpson/3, psimpson/4, psimpson/3, sum/3, psum/3]).
-compile([native]).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% exports API
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

-spec(simpson/4 :: (From :: float(), To :: float(), N :: integer(), Func :: function()) -> float()).
-spec(psimpson/4 :: (From :: float(), To :: float(), N :: integer(), Func :: function()) -> float()).
-spec(sum/3 :: (I :: integer(), N :: integer(), Func :: function()) -> float()).
-spec(psum/3 :: (I :: integer(), N :: integer(), Func :: function()) -> float()).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% internal API
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

-spec(up_to_even/1 :: (N :: integer()) -> integer()).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% implementation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

simpson(From, To, Func) ->
    simpson(From, To, 1000, Func).

simpson(From, To, N, Func) when N > 2 ->
    if
        From < To -> simpson_no_safe(From, To, up_to_even(N), Func, fun sum/3);
        From > To -> - simpson_no_safe(To, From, up_to_even(N), Func, fun sum/3);
        From == To -> 0.0
    end.

psimpson(From, To, Func) ->
    psimpson(From, To, 1000, Func).
   
psimpson(From, To, N, Func) when N > 2 ->
    if
        From < To -> simpson_no_safe(From, To, up_to_even(N), Func, fun psum/3);
        From > To -> - simpson_no_safe(To, From, up_to_even(N), Func, fun psum/3);
        From == To -> 0.0
    end.

simpson_no_safe(From, To, N, Func, Sum) ->
    Step = (To - From) / N,
    Result = 2.0 * Sum(1, N div 2 - 1, fun(I) -> Func(From + 2.0 * I * (To - From) / N) end) +
             4.0 * Sum(1, N div 2, fun(I) -> Func(From - Step + 2.0 * I * (To - From) / N) end) +
             Func(From) + Func(To),
    Result * Step / 3.0.

up_to_even(N) when is_integer(N) ->
    N + (N rem 2).    

sum(I, N, Func) ->
    rec_sum(I, N, Func, 0.0).

rec_sum(N, N, Func, Result) ->
    Func(N) + Result;
rec_sum(I, N, Func, Result) ->
    rec_sum(I + 1, N, Func, Func(I) + Result).

for(N, N, Func) ->
    Func(N);
for(I, N, Func) ->
    Func(I),
    for(I + 1, N, Func).

psum(I, N, Func) ->
    S = self(),
    Id = make_ref(),
    for(I, N, fun(Arg) -> spawn(fun() -> S ! {calculate_complete, Id, Func(Arg)} end) end),
    sum(I, N, fun(_) -> receive {calculate_complete, Id, Value} -> Value end end).
 

Функция simpson(From, To, Func) вычисляет интеграл от функции func в пределах от From до To. Функция psimpson(From, To, Func) делает тоже самое, только параллельно.

Видно, что код для параллельного вычисления интеграла занял 75 строк кода (!!!).

Теперь посмотрите как логично выглядит вызов интеграла:
1. Вызов функции интегрирования: $\int_{2}^{0}{x^3 dx}$
Используется синтаксис Erlang
integral:simpson(2, 0, fun(X) -> math:pow(X, 3) end).


2. Многомерный интеграл: $\int_{0}^{1}{\int_{sin{x}}^{cos{x}}{x y^2 (2 x + 3 y)}} dx}$
Используется синтаксис Erlang
integral:psimpson(0, 1, fun(X) -> integral:simpson(math:sin(X), math:cos(X), fun(Y) -> X*Y*Y*(2*X + 3*Y) end) end).
интеграл от интеграла от функции.

3. Мало того, можно ввести первообразную, сразу определив её:
Используется синтаксис Erlang
G = fun(Arg) -> integral:simpson(0, Arg, fun(X) -> math:pow(X, 3) end).


Никаких лишних сущностей, всё наглядно и просто. У меня двухпроцессорный комп. При параллельном вычислении оба процессора загружены на 100 процентов. У кого четырёх процессорный запустите - будут загружены все 4. Интересно, что в коде создаётся 1000 процессов (в эрланговском понимании), а в процессе werl.exe количество запущенных потоков при выполнении кода не изменяется (у меня их 10 штук). Так что эрланговский процесс - это даже не поток. Эрланг сам соображает сколько потоков ему создать и какой код на них закинуть.

P.S. подсветка синтаксиса подглючивает. Неправильно цвета отображает.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение28.02.2011, 08:55 
Заслуженный участник


28/09/08
855
 i  Тема перенесена из раздела "Свободный полет".

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 03:17 
Заслуженный участник


09/08/09
3438
С.Петербург
cupuyc в сообщении #418202 писал(а):
Собственно вот сорец.
...
Спасибо, cupuyc.

На мой взгляд, пример этот слегка надуманный. Уж больно неэффективный код получается: во внешнем интеграле суммирование распараллеливается на 500 веток, а во внутреннем -- каждая из этих веток бьется еще на 500. Т. е. для иллюстрации того, как здорово загружаются процессоры, он конечно годится, а для реальных расчетов подобный подход приносит больше вреда, чем пользы.

(Оффтоп)

На C# такой код можно строчек в 30 уместить, до только толку от этого не вагон :)

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 03:55 
Заслуженный участник


04/05/09
4587

(Оффтоп)

На C++ этой же задачей мне мой комптьютер заметно загрузить не удалось - в одну нитку считается за долю секунды.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 09:40 
Аватара пользователя


30/07/10
254
Maslov в сообщении #418575 писал(а):
На мой взгляд, пример этот слегка надуманный. Уж больно неэффективный код получается: во внешнем интеграле суммирование распараллеливается на 500 веток, а во внутреннем -- каждая из этих веток бьется еще на 500. Т. е. для иллюстрации того, как здорово загружаются процессоры, он конечно годится, а для реальных расчетов подобный подход приносит больше вреда, чем пользы.

Работает не 500 потоков, а всего 2. На каждый процессор по потоку. Если у Вас 4 процессорный комп, то будет работать 4 потока. Запустите и посмотрите сколько запущенных потоков в процессе. Распаралеливается только внешний интеграл.

Maslov в сообщении #418575 писал(а):
На C# такой код можно строчек в 30 уместить, до только толку от этого не вагон :)
Напишите. Боюсь, что не с чем будет сравнивать.

-- Вт мар 01, 2011 12:45:48 --

venco, до сих пор никакого сорца С++ я ещё не видел. Так что скорее всего у Вас вообще ничего не считается.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 13:38 
Заслуженный участник
Аватара пользователя


30/01/06
72407

(Оффтоп)

cupuyc в сообщении #418202 писал(а):
Открою тему в программировании

Я туда не хожу. Пока.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 16:41 
Заслуженный участник


04/05/09
4587
cupuyc в сообщении #418611 писал(а):
venco, до сих пор никакого сорца С++ я ещё не видел. Так что скорее всего у Вас вообще ничего не считается.
Вы сомневаетесь, что приведённые Вами вычисления можно выполнить быстрее, чем это получилось у Вас?
Там всего-то миллион вызовов простой функции.

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 17:38 
Заслуженный участник


09/08/09
3438
С.Петербург
cupuyc в сообщении #418611 писал(а):
Работает не 500 потоков, а всего 2. На каждый процессор по потоку. Если у Вас 4 процессорный комп, то будет работать 4 потока. Запустите и посмотрите сколько запущенных потоков в процессе.
Я писал про ветки, а не про потоки в смысле ОС. Несмотря на то что реально работают только 4 потока, дополнительные ресурсы на создание 500 эрланговских "веток" все равно расходуются.
cupuyc в сообщении #418611 писал(а):
Распаралеливается только внешний интеграл.
Извините, просмотрел.

cupuyc в сообщении #418611 писал(а):
Maslov в сообщении #418575 писал(а):
На C# такой код можно строчек в 30 уместить, до только толку от этого не вагон :)
Напишите. Боюсь, что не с чем будет сравнивать.
Не бойтесь.
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
  1. using System;
  2. using System.Threading.Tasks;
  3.  
  4. class Program
  5. {
  6.     private static double SeqSimpson(double xmin, double xmax, int steps, Func<double, double> fnc)
  7.     {
  8.         return Simpson(xmin, xmax, steps, fnc, SeqFor);
  9.     }
  10.  
  11.     private static double ParSimpson(double xmin, double xmax, int steps, Func<double, double> fnc)
  12.     {
  13.         return Simpson(xmin, xmax, steps, fnc, (f, t, fun) => Parallel.For(f, t, fun));
  14.     }
  15.  
  16.     private static double Simpson(double xmin, double xmax, int steps, Func<double, double> fnc, Action<int, int, Action<int>> forFnc)
  17.     {
  18.         object monitor = new object();
  19.         double result = fnc(xmin) + fnc(xmax);
  20.         double dx = (xmax - xmin) / steps;
  21.         forFnc(1, steps + 1, i => { double s = 4 * fnc(xmin + (i - 0.5) * dx); lock (monitor) { result += s; } });
  22.         forFnc(1, steps, i => { double s = 2 * fnc(xmin + i * dx);  lock (monitor) { result += s; } });
  23.         return dx / 6 * result;
  24.     }
  25.  
  26.     private static void SeqFor(int fromInclusive, int toExclusive, Action<int> action)
  27.     {
  28.         for (int i = fromInclusive; i < toExclusive; i++)
  29.             action(i);
  30.     }
  31.  
  32.     static void Main(string[] args)
  33.     {
  34.         double res = ParSimpson(-1, 1, 1000,
  35.             x => SeqSimpson(-Math.Sqrt(1-x*x), +Math.Sqrt(1-x*x), 1000, y => 1.5 * Math.Sqrt(Math.Abs(1 - x*x - y*y))));
  36.         Console.WriteLine("{0}", res);
  37.     }
  38. }
В качестве теста считается интеграл
$\int\limits_{-1}^{1}dx\int\limits_{-\sqrt{1-x^2}}^{\sqrt{1-x^2}}\frac 3 2 \sqrt{1 - x^2 - y^2}~dy$
(по-моему, должно получиться примерно $\pi$ :))

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

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение01.03.2011, 23:40 
Аватара пользователя


30/07/10
254
venco в сообщении #418727 писал(а):
Вы сомневаетесь, что приведённые Вами вычисления можно выполнить быстрее, чем это получилось у Вас?Там всего-то миллион вызовов простой функции.
Я такого не говорил. Речь о другом.

-- Ср мар 02, 2011 02:43:38 --

Maslov в сообщении #418741 писал(а):
Я писал про ветки, а не про потоки в смысле ОС. Несмотря на то что реально работают только 4 потока, дополнительные ресурсы на создание 500 эрланговских "веток" все равно расходуются.
Мне кажется там просто сообщения в очередь помещаются, а потоки ох по мере накопления обрабатывают. Механизм очередей - не так уж ресурсоёмко, хотя не знаю что Вы имеете ввидую

 Профиль  
                  
 
 Re: Язык программирования для математика
Сообщение02.03.2011, 00:00 
Заслуженный участник


04/05/09
4587
cupuyc в сообщении #418863 писал(а):
venco в сообщении #418727 писал(а):
Вы сомневаетесь, что приведённые Вами вычисления можно выполнить быстрее, чем это получилось у Вас? Там всего-то миллион вызовов простой функции.
Я такого не говорил. Речь о другом.
А о чём?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 195 ]  На страницу Пред.  1 ... 7, 8, 9, 10, 11, 12, 13  След.

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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