Как определить функцию в mathemathica, которая использует сложное рекуррентное отношение? - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь написать небольшой скрипт для вычисления целочисленной последовательности. Функция, которую я пытаюсь написать в коде - это функция на доске, a (n). Проблема в том, что я ожидал, что функция h (n), которую я определил в скрипте, даст в результате число, но она дает что-то другое: для h (2) это дает ArgMax[{p, HarmonicNumber[p] <= 1}, p, Integers] Как я могу это исправить? (Вы должны понимать, что я ни в коем случае не программист и не знаю много о mathematica. Спасибо в advnace. Сценарий, который я написал, такой:

    h[n_] := (ArgMax[{p, 
      Sum[1/s, {s, 1 + Sum[h[k], {k, 1, (n - 1)}], p}] <= 1}, p, 
     Integers]) - Sum[h[k], {k, 1, (n - 1)}]; h[1] = 1;

Image of the definition written by hand a (n) = (максимум p такой, что сумма от s равна r до p меньше или равна единице) -r + 1, где r = 1 + сумма от k = 1 до (n-1) a (k) и a (1) = 1

PD: те буквы, которые выглядят как буквы v, являются буквами R. Извините.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020
a[1] = 1;

a[n_] := Module[{sum = 0},
  r = 1 + Sum[a[k], {k, n - 1}];
  x = r;
  While[sum <= 1, sum += 1/x++];
  p = x - 2;
  p - r + 1]

Table[a[n], {n, 6}]

{1, 2, 6, 16, 43, 117}

Результат для a[4] равен 16, а не 14.

Для иллюстрации , когда n = 4

r = 1 + Sum[a[k], {k, 4 - 1}]

  = 1 + a[1] + a[2] + a[3]       (* refer to established results for a[n] *)

  = 1 +  1  +  2  +  6  =  10

sum = 0;
x = r;
While[sum <= 1, sum += 1/x++];
p = x - 2;
p - r + 1

16

или в другой форме

Total[Table[1/s, {s, 10, 25}]] <= 1   (* True *)

p - r + 1 = 25 - 10 + 1 = 16

Использование памятка , как упомянутый ogerard

Clear[a]

a[1] = 1;

a[n_] := a[n] = Module[{sum = 0},
   r = 1 + Sum[a[k], {k, n - 1}];
   x = r;
   While[sum <= 1, sum += 1/x++];
   p = x - 2;
   p - r + 1]

только сокращает время следующего запуска на 9 секунд

Timing[Table[a[n], {n, 14}]]

{40.8906, {1, 2, 6, 16, 43, 117, 318 865, 2351, 6391, 17372, 47222, 128363, 348927}}

1 голос
/ 13 февраля 2020

Основная причина, по которой вы получаете этот ответ, заключается в том, что команда Sum в Mathematica делает сложные вычисления c для преобразования терминов и выражений в классические математические функции, пытаясь сделать наименьшие возможные предположения для всего.

Конечно, если вы суммируете инверсии целых чисел, она попытается go вернуться к номеру гармоники c.

Это очень часто полезно, но может иметь перекрестные цели.

Чтобы избежать этого, просто замените

Sum[ , {var, start, end}]

на

Total[Table[ , {var, start, end}]]

Это должно дать вам то, что вы хотите без добавленного времени символьной c интерпретации слагаемого.

В любом случае в вашем коде есть серьезные проблемы.

  • Вы должны использовать памятку для h

  • Вы хотите найти максимальный p такой, что сумма инверсий, начинающихся с r, ниже или равна 1. Ваш код не собирается этого делать. Вы не можете просто поместить неравенства в аргументы диапазона. Вы должны l oop вокруг вашей суммы с помощью управления или использовать обратные функции.

...