最近我正在研究一個不和諧的機器人來計算三次方程的根。
我已經事先在 C# 中制作了另一個程式,它基本上做同樣的事情,并且被證明可以正常作業,所以我直接將代碼復制到我現在正在使用的程式中。
(假設我正在計算 7x 3 2x 2 12x 9 = 0 的根)
下面的代碼來自預先創建的程式:(
再次 證明程式和結果是正確的,結果是列在代碼的底部) *
// parts 1-5
double p1 = -(b / (3 * a));
double p2 = (b * c / (6 * Math.Pow(a, 2))) - (Math.Pow(b, 3) / (27 * Math.Pow(a, 3))) - (d / (2 * a));
double p3 = (c / (3 * a)) - (Math.Pow(b, 2) / (9 * Math.Pow(a, 2)));
Complex p4 = new Complex(-1.0 / 2, Math.Sqrt(3) / 2);
Complex p5 = new Complex(-1.0 / 2, -(Math.Sqrt(3) / 2));
// solve for roots
Complex root1 = p1 Math.Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3)))
Math.Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3)));
Complex root2 = p1 (p4 * Math.Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))))
(p5 * Math.Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))));
Complex root3 = p1 (p5 * Math.Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))))
(p4 * Math.Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))));
/*
results :
root1 = (-0.6566823203779361, 0)
root2 = (0.18548401733182518, 1.3868992549529795)
root3 = (0.18548401733182518, -1.3868992549529795)
*/
我繼續將整個內容復制到我正在開發的新程式中。然后我意識到在我的新程式中 Math.Cbrt 函式不存在(我不知道為什么)。因此我制作了一個自定義程式來解決這個問題,這是我的新程式中的代碼:(
這是有問題的程式,結果與第一個不同。)
// parts 1-5
double p1 = -(b / (3 * a));
double p2 = (b * c / (6 * Math.Pow(a, 2))) - (Math.Pow(b, 3) / (27 * Math.Pow(a, 3))) - (d / (2 * a));
double p3 = (c / (3 * a)) - (Math.Pow(b, 2) / (9 * Math.Pow(a, 2)));
Complex p4 = new Complex(-1.0 / 2, Math.Sqrt(3.0) / 2);
Complex p5 = new Complex(-1.0 / 2, -(Math.Sqrt(3.0) / 2));
// solve for roots
Complex root1 = p1 Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3)))
Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3)));
Complex root2 = p1 (p4 * Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))))
(p5 * Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))));
Complex root3 = p1 (p5 * Cbrt(p2 Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))))
(p4 * Cbrt(p2 - Math.Sqrt(Math.Pow(p2, 2) Math.Pow(p3, 3))));
public static Complex Cbrt(Complex value)
{
Complex result = Complex.Pow(value, 1D / 3);
return result;
}
/*
results :
root1 = (0.965490835755936, 0.936562108366076)
root2 = (0.185484017331825, -0.486224961779172)
root3 = (-1.43668913880205, -0.450337146586904)
*/
我試圖提取代碼的不同部分并單獨運行它,但我仍然無法找到原因。如果代碼相同,為什么它們會產生不同的結果?或者是我創造了這背后真正的問題的 Cbrt 方法?
uj5u.com熱心網友回復:
參考@mikuszefski 的評論,
這背后的真正原因是我創建的 Cbrt() 函式錯誤地計算了負數。
例如,Cbrt(-1)應該產生結果-1。
但是,我得到的答案是(NaN, 0)。
我在另一個執行緒中找到了解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449145.html
下一篇:如何在串列中的數字之間分配值
