2013-03-17 3 views
0

У меня есть ноутбук, предназначенный для исчерпывающего поиска чисел в массиве, используемом в уравнении, если уравнение равно определенной переменной, тогда оно возвращает значения переменных в уравнении. Единственная проблема заключается в том, что оператор If в последнем For-loop никогда не пробегает функции true/false/none. Единственный способ, которым я смог заставить его сделать что-либо, - использовать общий Print [blah], из которого он затем начинает печатать абсолютно каждую итерацию через все For-loops. Вот то, что я так далекоMathematica- Если утверждение не выполняется true/false

AvTarget := -95 
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
    3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10} 
trueArr := {} 
falseArr := {} 
For[i = 1, i <= Length[arr], i = i + 1, 
For[j = 1, j <= Length[arr], j = j + 1, 
    For[k = 1, k <= Length[arr], k = k + 1, 
    If[Abs[ 
     AvTarget - (arr[[i]] + arr[[k]] + (arr[[i]] + arr[[k]])/ 
     arr[[j]])] < 1000, Append[trueArr, {i, j, k}], 
    Append[falseArr, 1], Append[falseArr, 0]] 
    ] 
    ] 
] 
Length[trueArr] 
Length[falseArr] 

я не занимался с петлями в Mathematica еще, так что я не уверен, что проблема есть.

Edit- ИТАК этот код теперь работает так, как мне нужно это -

AvTarget = -95; 
tol = 0.1; 
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
    3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10} 
trueArr = {}; 
falseArr = {}; 
For[i = 1, i <= Length[arr], i++, 
For[j = 1, j <= Length[arr], j++, 
    For[k = 1, k <= Length[arr], k++, 
    If[Abs[ 
     AvTarget - (-(arr[[i]] + arr[[k]] + (arr[[i]]*arr[[k]])/ 
      arr[[j]]))] <= tol, 
    trueArr = Append[trueArr, {arr[[i]], arr[[j]], arr[[k]]}], 
    Append[falseArr, 1], Append[falseArr, 0]] 
    ] 
    ] 
] 
Length[trueArr] 

Оттуда, если длина> 0 Я могу только добавить, если отобразить результаты. Какой был бы лучший способ получить все результаты в пределах допустимого отпечатка в порядке, близком к AvTarget?

ответ

1

Петли - это почти всегда неправильный способ пойти с Mathematica. Я переписал свой исходный код для

avTarget = -95; 
arr := {1, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2, 2.2, 2.4, 2.7, 3, 3.3, 
    3.6, 3.9, 4.3, 4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1, 10}; 
triples = Tuples[arr, 3]; 
trueArr = Select[triples, Abs[avTarget - (#[[1]] + #[[3]] + (#[[1]] + #[[3]])/#[[2]]) < 
    1000] &]; 
falseArr = Complement[triples,trueArr]; 

Я использую Mathematica в течение примерно 20 лет, я не могу вспомнить, когда-либо необходимости петель. Конечно, иногда легче выразить алгоритм с использованием циклов, чем функциональные альтернативы, которые предоставляет Mathematica, но вы должны действительно отбросить костыли, которые они предоставляют, и пройти путь Mathematica.

+0

Ну, это довольно круто. Я включил этот код в него (и, спасибо, тоже могу использовать это довольно много в будущем), но он, похоже, не возвращает значения, когда я вызываю trueArr, есть ли какой-то конкретный способ, которым я должен это делать? –

+0

Ой, нашел проблему, неуместную скобку, Abs подходит только для раздела AvTarget - equation. –

1

Вы должны присвоить возвращаемую величину Append соответствующей переменной.

1

Append [trueArr, {i, j, k}] добавляет trueArr с {i, j, k} и затем отбрасывает результат. Вы хотите trueArr = Добавить [trueArr, {i, j, k}]. Также: ": =" - это оператор SetDelayed. Вы должны использовать «=».

+0

Я добавил небольшой дополнительный бит, если это не так уж сложно, можете ли вы дать мне предложение? Лично я думал о том, чтобы положить все это в цикл While, медленно увеличивая 'tol' до тех пор, пока не будет' Length [trueArr]> 0'. Кроме того, знаете ли вы способ использования значения и передать его как строку в строке? Например, в рубине вы сделали бы это как '' Ответ: # {x} "' –

Смежные вопросы