2013-03-17 69 views
0

我有一個筆記本設置爲在方程中使用的數組中進行窮舉搜索,如果方程等於定義的變量,則返回變量的值在等式中。唯一的問題是,最後一個For循環中的If語句永遠不會運行true/false/none函數。我能夠完成任何事情的唯一方法是使用通用打印[blah],然後繼續打印所有For循環的每次迭代。這是我到目前爲止 -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} 
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我可以再補充一個如果顯示的結果。以最接近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時,它似乎沒有返回值,是否有具體的方法需要這樣做? – 2013-03-17 09:46:15

+0

哦,發現問題,放錯了方括號,Abs只用於AvTarget - 方程式部分。 – 2013-03-17 09:49:03

1

您應該將返回值Append分配給相應的變量。

1

追加[trueArr,{i,j,k}]給出帶有{i,j,k}的trueArr,然後丟棄結果。你想要trueArr = Append [trueArr,{i,j,k}]。 另外,「:=」是SetDelayed運算符。你應該使用「=」。

+0

我已經添加了一點額外的一點,如果它不是太麻煩,你能給我一個建議嗎?我個人認爲把它全部放在While循環中,慢慢增加'tol'直到它的長度[trueArr]> 0'。 另外,你知道一種方法來使用一個值,並將其作爲字符串內的字符串傳遞?例如,在紅寶石中,你會這樣做''答案是:#{x}「' – 2013-03-17 09:27:35