У меня есть код, в котором нам сначала нужно сгенерировать n + 1 число в диапазоне с заданным шагом. Однако я не понимаю, как и почему это работает:
a = 2;
b = 7;
h = (b-a)/n;
x[0] = a;
Array[x, n+1, 0];
For[i = 0, i < n + 1, i++, x[i] = a + h*i]
Мои вопросы:
Попробуйте Range[2,10,2]
для диапазона чисел от 2 до 10 с шагом 2 и т. д.
Кроме того, есть некоторые ошибки в вашем коде или, возможно, в вашем понимании Mathematica...
x[0] = a
определяет функцию с именем x
, которая при представлении аргумента 0
возвращает a
(или значение a
, поскольку оно определено ранее). Mathematica уделяет особое внимание используемым символам скобок [
и ]
, которые заключают в себя списки аргументов функций. Поскольку для функции x
нет другого определения (по крайней мере, мы не видим здесь), то она будет возвращать невычисленное значение для любого аргумента, кроме 0
.
И вы правы, двойные квадратные скобки, то есть [[
и ]]
, используются для заключения значений индекса. x[[2]]
действительно будет относиться ко второму элементу списка с именем x
. Обратите внимание, что Mathematica индексирует из 1
, поэтому x[[0]]
выдаст ошибку, если x
существует и является списком.
Выражение Array[x, n+1, 0]
действительно возвращает значение, но оно не присваивается никакому символу, поэтому теряется. И завершающий ;
в строке подавляет поведение Mathematica по умолчанию, чтобы напечатать возвращаемое значение любого выражения, которое вы выполняете.
Наконец, по вопросу использования For
для создания списков значений обратитесь к https://mathematica.stackexchange.com/questions/7924/alternatives-to-procedural-loops-and-iterating-over-lists- в математике. И, возможно, задайте дополнительные вопросы по Mathematica на этом сайте, ведь там гораздо больше шансов найти настоящих экспертов по системе.
Полагаю, я мог бы добавить ... если вы намерены использовать Array
по какой-то причине, задайте другой вопрос конкретно об этом. Как вы могли (не) осознавать, я рекомендую не использовать эту функцию для создания списка чисел.
Из документов Array[f, n, r] генерирует список, используя начало индекса r.
Сам по себе Array[x, n + 1, 0]
просто создает список x
функций, например.
n = 4;
Array[x, n + 1, 0]
{х[0], х[1], х[2], х[3], х[4]}
Если x
определен, он применяется, например.
x[arg_] := arg^2
Array[x, 4 + 1, 0]
{0, 1, 4, 9, 16}
В качестве альтернативы, чтобы использовать x
в качестве функциональной переменной, массив можно установить так
Clear[x]
With[{z = Array[x, n + 1, 0]}, z = {m, n, o, p, q}]
{x[0], x[1], x[2], x[3], x[4]}
{м, п, о, р, д}
Код OP устанавливает функциональные переменные x
в цикле For
, например.
Еще с n = 4
a = 2;
b = 7;
h = (b - a)/n;
For[i = 0, i < n + 1, i++, x[i] = a + h*i]
который может отображаться с помощью Array[x, n + 1, 0]
{2, 13/4, 9/2, 23/4, 7}
также x[0] == 2
Истинный
То же самое можно было бы сделать таким образом
Clear[x]
With[{z = Array[x, n + 1, 0]}, z = Table[a + h*i, {i, 0, 4}]]
{2, 13/4, 9/2, 23/4, 7}
Обратите внимание, что DownValues[x]
показывает определения функций.
{HoldPattern[x[0]] :> 2, HoldPattern[x[1]] :> 13/4, HoldPattern[x[2]] :> 9/2, HoldPattern[x[3]] :> 23/4, HoldPattern[x[4]] :> 7}
Здравствуйте, спасибо за ваш ответ. Этот код мне дали в примере лагранжевой интерполяции, просто мне он не показался хорошим и понятным, я сам слабо разбираюсь в языке. Поэтому, если есть лучшие альтернативы этому методу Array, я более чем счастлив использовать их вместо этого.