Как мне написать функцию Эйлера в Mathematica? - PullRequest
1 голос
/ 16 декабря 2011

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

Я сделал следующую автоматическую функцию Эйлера.

f[x_, y_] := -x y^2;
x0 = 0;
y0 = 2;
xend = 2;
steps = 20;
h = (xend - x0)/steps // N;
x = x0;
y = y0;
eulerlist = {{x, y}};
For[i = 1, i <= steps, y = f[x, y]*h + y;
  x = x + h;
  eulerlist = Append[eulerlist, {x, y}];
  i++
]
Print[eulerlist]

Но он просто генерирует указанный мной список.

Я хотел бы иметь функцию Эйлера, которая может генерировать эту форму:

Euler[y, 2, -x y^2, {x, 0, 2}, 20]

Кажется, я не продвинулся дальше.

1 Ответ

3 голосов
/ 16 декабря 2011

Непонятно, о чем вы спрашиваете, но если вы хотите, чтобы можно было ввести

Euler[y, 2, -x y^2, {x, 0, 2}, 20] 

и получите

{{0,2},{0.1,2.},{0.2,1.96},{0.3,1.88317},{0.4,1.77678},{0.5,1.6505},{0.6,1.51429},{0.7,1.37671},{0.8,1.24404},{0.9,1.12023},{1.,1.00728},{1.1,0.905822},{1.2,0.815565},{1.3,0.735748},{1.4,0.665376},{1.5,0.603394},{1.6,0.548781},{1.7,0.500596},{1.8,0.457994},{1.9,0.420238},{2.,0.386684}}

Затем вам нужно написать определение функции следующим образом:

Euler[y0_, f_, {x0_, xend_}, steps_Integer?Positive] := (* body *)

Обратите внимание на подчеркивания для обозначения шаблонов, := для обозначения отложенной оценки и спецификацию шаблонов Integer?Positive.

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

Вот лучшее решение.

Euler[y_, y0_, f_, {x_, x0_, xend_}, steps_Integer?Positive] :=
 With[{h = N[(xend - x0)/steps], ff = Function[{x, y}, f]}, 
  NestList[{#[[1]] + h, ff[#[[1]], #[[2]]]*h + #[[2]]} &, {x0, y0}, 
   steps]]

Euler[y, 2, -x y^2, {x, 0, 2}, 20]

 {{0, 2}, {0.1, 2.}, {0.2, 1.96}, {0.3, 1.88317}, {0.4, 
  1.77678}, {0.5, 1.6505}, {0.6, 1.51429}, {0.7, 1.37671}, {0.8, 
  1.24404}, {0.9, 1.12023}, {1., 1.00728}, {1.1, 0.905822}, {1.2, 
  0.815565}, {1.3, 0.735748}, {1.4, 0.665376}, {1.5, 0.603394}, {1.6, 
  0.548781}, {1.7, 0.500596}, {1.8, 0.457994}, {1.9, 0.420238}, {2., 
  0.386684}}

Если вам нужно что-то, что выводит Euler[y, 2, -x y^2, {x, 0, 2}, 20], то набрать его в блокнот - самый быстрый способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...