【问题标题】:Mathematica- If statement not performing true/falseMathematica-If 语句不执行真/假
【发布时间】:2013-03-17 08:47:59
【问题描述】:

我设置了一个笔记本,用于对方程中使用的数组中的数字进行详尽的搜索,如果方程等于定义的变量,则它返回方程中变量的值。唯一的问题是,最后一个 For 循环中的 If 语句永远不会运行 true/false/neither 函数。我能够让它做任何事情的唯一方法是使用通用的 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]

我还没有处理过数学中的循环,所以我不确定问题是什么。

编辑- 好的,所以这段代码现在可以按照我需要的方式工作 -

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]

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

【问题讨论】:

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


    【解决方案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 的方式。

    【讨论】:

    • 嗯,这很酷。我已经将该代码合并到其中(也谢谢,我将来可以经常使用它)但是当我调用 trueArr 时它似乎没有返回值,有没有特定的方法我必须这样做?
    • 哦,找到问题了,括号放错了,Abs 只适用于 AvTarget - 方程部分。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我加了一点点,如果不是太麻烦你能给我一个建议吗?就我个人而言,我想把它全部放在一个 While 循环中,慢慢增加 tol 直到它 Length[trueArr] &gt; 0。另外,您知道一种使用值并将其作为字符串传递到字符串中的方法吗?例如,在 ruby​​ 中,你会像 "The answer is: #{x}"
      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 2018-07-31
      • 2020-03-20
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 2017-07-14
      • 2023-04-04
      相关资源
      最近更新 更多