0

方程式で使用される配列内の数値を徹底的に検索するように設定されたノートブックがあります。方程式が定義された変数と等しい場合、方程式内の変数の値を返します。唯一の問題は、最後の For ループの If ステートメントが true/false/どちらの関数も実行しないことです。私がそれを何かにできるようにする唯一の方法は、汎用の 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]

そこから、長さ > 0 の場合、If を追加して結果を表示するだけです。公差内のすべての結果を AvTarget に近い順に印刷するにはどうすればよいでしょうか?

4

3 に答える 3

1

の戻り値をAppendそれぞれの変数に割り当てる必要があります。

于 2013-03-17T09:04:19.730 に答える
1

Append[trueArr, {i,j,k}] は、{i,j,k} が追加された trueArr を返し、結果を破棄します。trueArr = Append[trueArr, {i, j, k}] が必要です。また、「:=」は SetDelayed 演算子です。「=」を使用する必要があります。

于 2013-03-17T09:07:09.977 に答える
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 の道を歩むべきです。

于 2013-03-17T09:32:47.070 に答える