Mathematica- If语句不执行true / false

时间:2013-03-17 08:48:00

标签: if-statement for-loop wolfram-mathematica brute-force

我设置了一个笔记本,用于对方程中使用的数组中的数字进行详尽搜索,如果等式等于已定义的变量,则返回等式中变量的值。唯一的问题是,最后一个For循环中的If语句永远不会运行true / false / both函数。我能够让它做任何事情的唯一方法是使用通用的Print [blah],然后通过所有For循环完成每次迭代的打印。这是我到目前为止所拥有的 -

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中的循环,所以我不确定问题是什么。

修改 - 好的,所以这段代码现在按我需要的方式工作 -

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]

如果长度&gt;那么0我可以添加一个If来显示结果。以最接近AvTarget的顺序打印公差范围内的所有结果的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

您应该将Append的返回值分配给相应的变量。

答案 1 :(得分:1)

Append [trueArr,{i,j,k}]给出附加了{i,j,k}的trueArr,然后丢弃结果。你想要trueArr = Append [trueArr,{i,j,k}]。 此外,“:=”是SetDelayed运算符。你应该使用“=”。

答案 2 :(得分: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方式。