Сложные математические вычисления программирование

Язык программирования для математических расчетов?

Как вы думаете, на каком языке программирования лучше всего реализовывать сложные расчеты (финансовая и актуарная математика, статистика).

Понимаю что для этих целей собирают супер-компьютеры и HPC кластеры, но все-таки, какой язык использовать предпочтительней в условиях относительно слабой вычислительной мощности?

Я думаю, что язык должен быть функциональным, так как эта парадигма наиболее близка к чистой математике, так же важна возможность кластеризации приложения…

Вообщем, у кого какие мысли по этому поводу?

Если у кого есть опыт написания подобных приложений — буду очень признателен, если опишите хотя бы в трех словах как вы это делали.

Очень интересно, да и на shootout.alioth.debian.org/ отображены очень неплохие результаты особенно по скорости у этого языка. Думаю стоит плотнее к нему присмотреться.

Поддерживаю Фортран. Хорошо оптимизированный интелловский компилятор, есть некоторые конструкции близкие к функциональным языкам, вроде удобных операций над массивами, которые автоматически распараллеливиаются, много готовых библиотек.

Во-первых, парадигма функционального программирования всего-лишь говорит о том, как писать программы. Цель данной парадигмы — оформлять программы как математические функции.

Читайте также:  Язык программирования prolog пример
Конечно, за этим стоят какие-то большие цели, кто-то считает что это единственный верный способ программирования, кто-то поклоняется данной парадигме как богу. Но данные люди, простите за столь грубое высказывание — дураки. Истина находится «между». Иначе говоря, функциональное программирование позволяет сделать код более компактным, красивым, быстрым, но использование только этой парадигмы, игнорируя остальные — только вред.

Важно понять что требуется от языка. Как я вижу, требование одно — большая скорость при небольших ресурсах, которые не будут увеличиваться(я правильно понял?).
Если всё так критично(100 и 1 раз оцените задачу!), то выбор не велик: C, C++.
Если хочется вкусить функциональщины, то можно попробовать Haskell, CL(Common Lisp). Но я повторюсь, если в задаче есть слово «функция», это ещё не значит что нужно использовать «функциональное программирование».

большая скорость при небольших ресурсах
Да, именно оно, но еще чего хотелось бы получить это скорость разработки и элегантность кода на выходе (да, я люблю красивые вещи)
Я понимаю что C язык быстрый и при правильном уходе требует мало ресурсов, но я видел как решались тривиальные интегральные уравнения на нем — мне не понравилось.

Ради эксперимента, могу посоветовать тот же CL, Haskell, но для первого нужны хорошие программисты(чтобы не наделали бед), а для второго нужно много времени на изучение и сложнее найти специалистов.
Могу посоветовать C++ с использованием Qt, boost, получается не такой и страшный код, зато в будущем не будет проблем.

Про высокопроизводительные вычисления в R имеет смысл посмотреть cran.r-project.org/web/views/HighPerformanceComputing.html.
Возможно, компромисс скорости разработки производительности поможет достигнуть использование Rcpp. Кое-что про это есть тут есть и завязки к hadoop etc. Большая проблема в этом смысле то, что R хранит объекты в памяти, но с помощью сторонних пакетов это преодолевается для больших объёмов данных.

Так как при разработке R учитывался опыт Scheme, в нём во многом поддерживается ФП (более подробно советую смотреть отличную книгу проф. Чемберса Software for Data Analysis).

Точно, R это то что доктор прописал, особенно если нужно бесплатное решение
Если платность не волнует — смотрите Matlab

Это первое что пришло мне в голову, честно говоря, подтектс этого вопроса — узнать о альтернативах Haskell’у 🙂

>>большая скорость при небольших ресурсах
>>Да, именно оно, но еще чего хотелось бы получить это скорость разработки и элегантность кода на выходе (да, я люблю красивые вещи)

Будь у человека больше вычислительных ресурсов, я бы посоветовал именно Пайтон, т.к. в нём присутствуют все парадигмы в необходимом для качественного кода объёме.
В конце концов, Пайтон не создан для таких вещей. Если такое и писать на нём, то только в виде модуля на Си.

Я думаю, что язык должен быть функциональным, так как эта парадигма наиболее близка к чистой математике,

Я же бы решил, что если нужно делать именно математические расчеты, то следует подумать о математическом пакете, например Matlab. Если Вы хотите получить лаконичность кода, то с этим здесь не должно быть проблем. Огромное количество стандартных функций математики и статистики. С тулбоксами Financial Derivatives Toolbox и Financial Toolbox не знаком, но список функций выглядит внушительным.
Скорость вычислений при правильном программировании, по моим наблюдениям ниже не более, чем в 2 раза (в сравнении, с C#, например). Можно использовать компиляторы и вызывать функции Matlab из любого языка. Правда в этом случае существенным недостатком является долгий старт окружения Matlab.

Можно еще добавить, что если хочется чисто функционального языка, то больше подойдет пакет Mathematica. Хотя MatLAB в плане программирования, конечно, более предпочтительный.

MATLAB оптимален для большинства прикладных задач, тем более подразумевает удобную интеграцию с другими языками.

Если задачи подразумевают широкое использование существующих алгоритмов (без вмешательства в их код) то Матлаб.

Если же алгоритмы будут свои или потребуется адаптация (с внутренним насилием!) чужих или же необходимость перехода в один прекрасный день к большим вычислительным мощностям, то Фортран.

MATLAB — является платным пакетом, если вас это не устраивает, то можно посмотреть в сторону Octave. Octave — опенсорсный продукт, синтаксис схож с MATLAB. Прекрасно подходит для высокоуровневого программирования математических расчетов.

Войдите, чтобы написать ответ

Где я мог увидеть задачу про то как объект идёт по шагам вперёд и впереди строится стена?

Источник

Программирование в среде Robot C. Приоритет операций. Сложные математические выражения

Операции присваивания, условная операция. Приоритеты операций и порядок вычислений. Лекция 11

В математических вычислениях важную роль играет порядок, в
котором выполняются действия. Чему, например, равно значение
выражения 2+2*2? Конечно же шесть, т.к. сначала выполняется
умножение.
В C используется знакомый нам порядок выполнения операций. Но
т.к. в программировании есть свои особенности, то кое-какие
отличия всё же есть.
Выпишем приоритет для тех операций, которые мы уже знаем.
1. вычисляются функции (например, sqrt(), cos() и др.)
2. умножение, деление, остаток от деления (слева направо)
3. сложение, вычитание
4. выполняется присваивание
Если нам нужно изменить порядок выполнения действий, то мы
можем использовать для этого круглые скобки

3. Приоритет операций

А каково значение переменной x после выполнения
следующего кода
int x = 8 / 4 / 2;
Правильный ответ 1. Т.к в случае одинакового приоритета
операций, команды выполняются слева направо. Другими
словами данный код эквивалентен коду
int x = (8 / 4) / 2;
Вот еще один пример
2+2*2 = 6
(2+2)*2 = 8 // действие в скобках будет выполнено прежде умножения

4. Приоритет операций

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

5. Сложные математические выражения

Иногда формулы, по которым нужно что-то вычислять, в
программе могут принимать довольно ужасный вид.
При этом когда мы пишем программу, любая формула
должна быть записана в одну строку. На начальном этапе
это может вызвать у вас некоторые затруднения. Чтобы
избавиться от этих затруднений, нужно овладеть навыком
переводить формулу из стандартной математической
записи в ту, которая используется в программировании и
обратно.

6. Способы записи сложных математических выражений

1.
2.
3.
Для записи сложных математических выражений полезно
использовать некоторые соображения, которые позволят
это сделать проще и не допустить ошибку.
При записи дробить общее выражение на мелкие части,
записывать их.
Вводить новые переменные.
Совершать математические преобразования, которые
могут упростить пример.
Рассмотрим эти идеи на примере.

7. Способы записи сложных математических выражений

Записать на языке С выражение
и вычислить его при a=6, b=100.
1. Пишем поэтапно: ()/()+()/() → (()/()+()/())*(()/()) →
теперь заполняем скобки →
((a-sqrt(b))/(a+sqrt(b))+(a+sqrt(b))/(a-sqrt(b)))*((2*a*sqrt(b)) /(a+sqrt(b)))
Получилось выражение. Возможно, какие-то скобки лишние, но лучше
поставить лишние скобки, чем забыть и получить неверный
ответ. Можете вставить это выражение в программу и вычислить.
Правильный ответ: 0.5

8. Способы записи сложных математических выражений

2. Можно ввести переменные
float t=a-sqrt(b);
float s=a+sqrt(b);
Тогда выражение будет записываться таким образом:
(t/s+s/t)*(2*a*sqrt(b))/s;
Можете проверить, что его вычисление даст такой же ответ 0.5.
3. Если преобразовать второе выражение, то получится более
простое:
Ответ получается таким же!

9. Задача 1.

Упорядочите указанные операции по убыванию
приоритета. Сверху операции, которые имеют более
высокий приоритет.
1.
2.
3.
4.
5.
*, /, %
+, операции в скобках
=
sqrt(), sin(), cos() и другие функции .

10. Задача 2.

1.
2.
3.
4.
5.
6.
Дано уравнение y=ax3+7. Среди указанных выражений
отметьте те, которые соответствуют верной записи этого
выражения на языке Си.
y = a * x * x * (x + 7);
y = (a * x) * x * (x + 7);
y = a*(x * x * x) + 7;
y = (a * x) * x * x +7;
y = a * x * x * x + 7;
y = a * x * (x * x + 7);

11. Задача 3.

Какое значение будет сохранено в переменной x после
выполнения следующего кода:
int x = 7 + 3 * 6 / 2 — 1;

12. Задача 4.

Какое значение будет сохранено в переменной x после
выполнения следующего кода:
int x = 2 % 2 + 2 * 2 — 2/2;

13. Задача 5.

Какое значение будет сохранено в переменной x после
выполнения следующего кода:
int x = (3 * 9 * (3 + (9 * 3 / 3)));

14. Задача 6.

Напишите программу, вычисляющую площадь треугольника по
трём сторонам.
Формат входных данных:
Вначале программы задаём три вещественных числа a, b, c —
длины сторон треугольника.
Формат выходных данных:
Одно число — площадь треугольника со сторонами a, b, c.
Точность — два знака после запятой.
Для вычисления площади используйте формулу Герона:
где p=(a+b+c)/2 – полупериметр.

15. Задача 7.

В выражении a/b*c/d*e/f*h расставьте скобки так, чтобы
выражению со скобками соответствовала дробь
Напишите программу, вычисляющее это выражение для
чисел a=7, b=2, c=3, d=7, e=8, f=3, h=4. Результат
вычисления должен быть равен 5.44.

16. Ответы к задачам

1. 3, 5,1, 4, 2
2. 3, 4, 5
3. 15
4. 3
5. 324
6. task main() float a=12.5, b=13.6, c=15.01, p, s;
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
nxtDisplayTextLine(1,”%.2f”,s);
>
7. a/(b*c/(d*e/(f*h)))

17. Завершение занятия

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

Источник

Оцените статью