2009-11-29 29 views
2

我期待實現簡單的等式:爪哇:實現簡單的等式

I,J = -Q±√(Q -4PR)/ 2P

爲此我有以下代碼(注:P = 10,Q = 7,R = 10):

//Q*Q – 4PR = -351 mod 11 = -10 mod 11 = 1, √1 = 1 
    double test = Math.sqrt(modulo(((Q*Q) - ((4*P)*R)))); 

    // Works, but why *-10 needed? 
    i = (int)(((-Q+test)/(P*2))*-10); // i = 3 
    j = (int)(((-Q-test)/(P*2))*-10); // j = 4 

簡單地說,測試需要的方程和器官功能障礙綜合徵的第一部分到一個非零整數在兩者之間0和11,然後寫入i和j。我和j返回正確的數字,但出於某種原因需要* -10才能使它們正確(一個數字我猜得到正確的值)。

如果可能,我想找到更好的方式來執行上述方程,因爲我的做法似乎是錯誤的,只是的作品。我想按照方程式的建議來做,而不是破解它的工作。

+1

當你的方程式清楚地表示平方根時,爲什麼使用「模數」?爲什麼使用模數? – 2009-11-29 12:48:45

+0

模數根據等式是正確的。我需要根據評論提示修改最終結果。 – AlexT 2009-11-29 13:31:19

+1

根據等式,模數是正確的?在你的文章的開頭看看公式 - 模數部分在哪裏?如果你真的*想要在那裏模數,請重寫你的問題 - 目前它令人難以置信的困惑。你聲稱它是「等式的一部分」,但它不是你向我們顯示的等式的一部分...... – 2009-11-29 13:36:36

回答

6

quadratic equation更通常以a,bc表示。爲了滿足ax + bx + c = 0,你得到(-b +/- sqrt(b^2-4ac))/2a作爲答案。

我認爲你的基本問題是你使用出於某種原因,而不是採取平方根。 -10的因子僅僅是一個適合你的測試用例的巧妙因素。

你應該有這樣的事情:

public static void findRoots(double a, double b, double c) 
{ 
    if (b * b < 4 * a * c) 
    { 
     throw new IllegalArgumentException("Equation has no roots"); 
    } 

    double tmp = Math.sqrt(b * b - 4 * a * c); 
    double firstRoot = (-b + tmp)/(2 * a); 
    double secondRoot = (-b - tmp)/(2 * a); 
    System.out.println("Roots: " + firstRoot + ", " + secondRoot); 
} 

編輯:目前你的modulo方法是要漂亮長期遞歸。試試這個:

public static int modulo(int x) 
{ 
    return ((x % 11) + 11) % 11; 
} 

基本上第一% 11的結果將在區間[-10,10] - 所以增加一個11,並採取% 11再次後,這將是正確的。不需要遞歸。

在這一點上沒有太多的原因,將它作爲一個單獨的方法,這樣你就可以使用:

public static void findRoots(double a, double b, double c) 
{  
    int squareMod11 = (((b * b - 4 * a * c) % 11) + 11) % 11; 
    double tmp = Math.sqrt(squareMod11); 
    double firstRoot = (-b + tmp)/(2 * a); 
    double secondRoot = (-b - tmp)/(2 * a); 
    System.out.println("Roots: " + firstRoot + ", " + secondRoot); 
} 
+0

我使用這些變量名稱的原因是因爲我以後在其他地方使用a,b和c來表示其他代碼字。我使用模數的原因是上面寫的;本質上我試圖模仿我在帖子底部寫的新的等式。我試過你的代碼,它每次都拋出IllegalArgumentException。 – AlexT 2009-11-29 13:04:56

+1

如果它正在顯示一個IllegalArgumentException,那麼您的方程式就是一個非真實的結果。如果你想使用複雜的數字,你必須「手動」實現並在Java中處理它們。 – svens 2009-11-29 13:17:22

+0

我已將每個數字都更改爲double,並刪除了所有的類型轉換。現在,i = -0.3和j = -0.4,這意味着如果我再次乘以-10,結果是正確的。我試圖在我的帖子中模仿i和j方程式,但我正在努力與這部分。 – AlexT 2009-11-29 13:26:13

1

你需要採取的平方根。請注意,Q^2-4PR產生一個負數,因此你將不得不處理複數(或限制輸入以避免這種情況)。 Apache Math可能會幫助你在這裏。

1

對平方根使用Math.sqrt。你爲什麼要投我和J?這是給你方根函數的方程,所以i和j可以是任何複數。您應該將判別式限制爲真(雙)根的正值,否則使用複數。


double test = Q*Q - 4*P*R; 
if(Q < 0) throw new Exception("negative discriminant!"); 
else { 
    test = Math.sqrt(test); 
    double i = (-Q + test)/2*P; 
    double i = (-Q - test)/2*P; 
} 
+0

squrt,squrt,squrt – BalusC 2009-11-29 15:36:58

+0

固定它,thx! :) – 2009-11-29 16:03:38

0

爲什麼你在做模而不是平方根?您的代碼似乎是得到一個二次方程的根的方式((A±開方(B^2-4ac))/ 2A),所以代碼應該是:

double delta = Q*Q-4*P*R); 
if(delta < 0.0) { 
    throw new Exception("no roots"); 
} 
double d = Math.power(delta,0.5); 
double r1 = (Q + d)/(2*P) 
double r2 = (Q - d)/(2*P) 
0

正如其他人指出, ,你對mod的使用甚至沒有錯。你爲什麼要這樣做數學?

衆所周知,如果b的值與判別式非常接近,那麼二次方程的樸素解可能會遇到問題。

一個更好的辦法來做到這一點,建議在 「數字食譜在C++」 的第5.6節:如果我們定義

alt text http://www.equationsheet.com/latexrender/pictures/e93ce851c026a881fb59476738c2139e.gif

然後兩個根源是:

alt text http://www.equationsheet.com/latexrender/pictures/d2cb8f1e8ef0744b7fb97267c608a92e.gif

alt text http://www.equationsheet.com/latexrender/pictures/2dc7db16d9744f2ee2c21483b1ece0d3.gif

您的代碼還需要考慮病理情況(例如a = 0)。

讓我們用你的值代入這些公式,看看我們得到了什麼。如果A = 10,B = 7,且c = 10,那麼:

alt text http://www.equationsheet.com/latexrender/pictures/4abfc656e0dfef66dab38c4d4ca0d435.gif

然後將兩根:

alt text http://www.equationsheet.com/latexrender/pictures/a67639f331d9e9a0a02b07a4c5324380.gif

alt text http://www.equationsheet.com/latexrender/pictures/f755ab384f9820be99e70918cea9b49a.gif

我認爲我有正確的跡象。

如果你的計算給你帶來麻煩,這很可能是因爲你有複雜的根源,你的方法無法正確考慮。你需要一個複雜的數字類。

+0

嗯,這看起來確實乍一看,但我之前有過數值食譜的麻煩,顯然我不是唯一一個:http://amath.colorado.edu/computing/Fortran/numrec.html – Ken 2009-11-29 16:57:44

+0

是的,數字食譜有這個聲望,但這個公式不是它的一部分。抱怨與實施有關,而不是數學或文本。 – duffymo 2009-11-29 17:38:42

+0

還應該注意的是,ODE章的Shampine評論對第一版進行了評論;第二版引入了他的許多建議;請參閱http://www.nr.com/bug-rebutt.html – duffymo 2009-11-29 17:41:32