Откуда эти негативы приходят в исполнении Maple? - PullRequest
1 голос
/ 27 января 2020

Я заинтересован в моделировании феномена «регрессии к среднему». Скажем, вектор 0-1 длины N «одарен», если число 1 в V больше, чем N / 2 + 5 * sqrt (N).

Я хочу, чтобы Maple оценил строку из M 0-1 списки, каждый длиной N, чтобы определить, являются ли они одаренными. Затем, учитывая, что список V [i] одарен, я хочу оценить вероятность того, что список V [i + 1] одарен.

Пока что мой код странным образом терпит неудачу. Пока все, что должен делать код, - это создать список сумм (называемых «итого») и список «g», который несет 0, если итого [i] <= N / 2 + 5sqrt (N), и 1 в противном случае. </p>

Вот код:

RS:=proc(N) local ra,i:

ra:=rand(0..1):

[seq(ra(),i=1..N)]:

end:

Gift:=proc(N,M) local total, i, g :

total:=[seq(add(RS(N)),i=1..M)]:
g:=[seq(0,i=1..M)]:

for i from 1 to M do

if total[i] > (N/2 + 5*(N^(1/2))) then
g[i]:=1

fi:
od:

print(total, g)

end:

Беда в том, что Maple отвечает, когда я пробую Gift (100,20), «Ошибка (в Gift) не может определить, является ли это Выражение истинно или ложно: 5 * 100 ^ (1/2) <-2 "или, когда я пытаюсь сделать подарок (10000,20)," Ошибка (в подарке) не может определить, является ли это выражение истинным или ложным: 5 * 10000 ^ (1/2) <-103. "</p>

Откуда эти отрицательные числа? И почему не может Мэйпл сказать, 5 (10000) ^ {1/2} <-103 или нет? </p>

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Отрицательные величины - это просто часть неравенства, которое возникает, когда часть с радикалом перемещается в одну сторону, а чисто рациональная часть перемещается в другую.

Используйте соответствующий механизм для разрешения условного теста. Например,

if is( total[i] > (N/2 + 5*N^(1/2)) ) then
  ...etc

или, скажем,

temp := evalf(N/2 + 5*N^(1/2));
for i from 1 to M do
  if total[i] > temp then
    ...etc
0 голосов
/ 28 января 2020

Из интерактивной справки Maple :

Важно: Команда evalb не упрощает выражения. Может возвращать false для отношения, которое является истинным. В таком случае примените упрощение к отношению перед использованием evalb.

...

Вы должны преобразовать аргументы symboli c в значения с плавающей запятой при использовании команды evalb для неравенств которые используют <, <=,> или> =.

В этом конкретном примере Maple задыхается при попытке определить, является ли символ c квадрат root меньше -2, хотя перед тем как выйти, он старался изо всех сил упростить.

Одно из исправлений - применить evalf к неравенствам. Вместо, скажем, evalb(x < y), вы бы написали evalb(evalf(x < y)).

Что касается , почему Maple не может справиться с этим неравенством, я не знаю.

...