Как определить функцию в математике, которая использует сложное рекуррентное соотношение?

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

    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;

Изображение определения, написанного от руки a(n)=(максимум p такое, что сумма от s равна r до p меньше или равна единице)-r+1, где r=1+сумма от k=1 до (n-1) числа a(k), и a(1 )=1

PD: Буквы, похожие на v, — это r. Извини.


person b0nes    schedule 12.02.2020    source источник
comment
Я думаю, что есть форум Stackexchange, посвященный Mathematica, поэтому вы можете получить там больше и лучшие ответы. Тем не менее, вам действительно нужно попытаться сформулировать проблему так, чтобы другие могли ее понять; ссылка на беспорядочное изображение не поможет другим понять. Помогите другим помочь вам, написав формулировку проблемы.   -  person Robert Dodier    schedule 13.02.2020
comment
Хорошо. Я увидел серьезный недостаток в сценарии, поэтому просто перепишу вопрос. Но я не нашел этот форум.   -  person b0nes    schedule 13.02.2020
comment
Взгляните на: mathematica.stackexchange.com   -  person Robert Dodier    schedule 13.02.2020


Ответы (2)


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}}

person Chris Degnen    schedule 13.02.2020

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

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

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

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

Sum[ , {var, start, end}]

by

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

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

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

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

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

person ogerard    schedule 13.02.2020
comment
Интересно, что Maximize[{Sum[1/s <= 1, {s, 4, p}]}, Element[p, Integers]] не обрабатывает. Я заинтригован тем, как можно использовать обратную функцию. Возможно, не этот конкретный случай. - person Chris Degnen; 13.02.2020