что такое хорошая неявная форма суммы (1/(1+x)^y) в J

В качестве упражнения для начинающих я попытался вычислить следующую сумму в J, sum(1/(1+0.03)^n for n = 1 to 30, используя +/%(1 + 0.03)^ >:i.30. Как я могу записать это в простой неявной форме? все, что я пробовал, значительно уродливее, чем явная форма выше, например >:@[ (+/&:%)@:^ >:&i.@]


person ahala    schedule 22.02.2013    source источник
comment
Неявная форма работает для одних расчетов более плавно, чем для других. Поскольку значения должны применяться в формуле нерегулярно, накладные расходы на их передачу в эти точки становятся обременительными. Этот факт обсуждается (в контексте, отличном от J) в сообщении блога, evincarofautumn.blogspot.com/2012/02/ в разделе "Темная сторона". Я думаю, что в имеющейся формуле два аргумента не являются неуклюжими по своей сути, а вместо этого прекрасно обрабатываются крючком, как демонстрирует Tikkanz.   -  person kaleidic    schedule 23.02.2013


Ответы (2)


Вы могли бы начать с

+/@:%@((1 + 0.03) ^ >:@i.) 30

Вы можете сделать 0,03 левым аргументом, используя форк, но использование хука может быть чище.

(1 + 0.03) +/@:%@([ ^ >:@i.@]) 30   NB. use fork
(1 + 0.03) +/@:%@(^ >:@i.) 30       NB. use hook

Одна и та же операция (приращение) выполняется как для левого, так и для правого аргументов ^. Это намек на то, что & (Compose) может оказаться полезным.

0.03 +/@:%@(^&>: i.) 30         NB. apply increment to both left & right arg
person Tikkanz    schedule 22.02.2013
comment
Мне нравится, как вы определили приращение как нечто общее для обеих сторон, а также то, как вы используете хук. В данном случае я предпочитаю Кэп, поэтому на данный момент я предпочитаю формулировку formula=: [: +/ [: % ( ^&>: i.). - person kaleidic; 23.02.2013

Когда мне нужна неявная функция, я часто позволяю 13 : выбить ее за меня. В этом случае некоторые вариации:

   13 : '+/ %((1+0.03)^1+i.y)'
[: +/ [: % 1.03 ^ 1 + i.

   13 : '+/ %((1+0.03)^>:i.y)'
[: +/ [: % 1.03 ^ [: >: i.

И с 1+0.03 или чем-то еще в качестве левого аргумента:

   13 : '+/ %(x^1+i.y)'
[: +/ [: % [ ^ 1 + [: i. ]

   13 : '+/ %(x^>:i.y)'
[: +/ [: % [ ^ [: >: [: i. ]

Слишком много заглавных букв ([:), чтобы назвать это менее уродливым, но это только начало.

person MPelletier    schedule 22.02.2013