sin(x)如何求解的java代碼實現方法

1 泰勒級數介紹

近期工作中需要使用matlab建模,期間做案例的時候有個方程:sin(x)=0,要求不使用現有api進行求解,然後有點懵,不知道如何下手,最後翻瞭很多資料終於有點頭緒。有瞭java的解題思路,再把思路轉變為stateflow就簡單瞭。

在數學中,泰勒級數用無限項連加式——級數來表示一個函數,這些相加的項由函數在某一點的導數求得。泰勒級數是以於1715年發表瞭泰勒公式的英國數學傢佈魯克·泰勒的名字來命名的。通過函數在自變量零點的導數求得的泰勒級數又叫做麥克勞林級數,以蘇格蘭數學傢科林·麥克勞林的名字命名。 泰勒級數在近似計算中有重要作用。

定理

以下圖截取自百度百科。

泰勒級數的重要性體現在以下三個方面:

  • 冪級數的求導和積分可以逐項進行,因此求和函數相對比較容易。
  •  一個解析函數可被延伸為一個定義在復平面上的一個開區域上的泰勒級數通過解析延拓得到的函數,並使得復分析這種手法可行。 
  • 泰勒級數可以用來近似計算函數的值。

2 sin(x)泰勒級數變換求解

2.1 將sin(x)展開成泰勒級數的形式

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

2.2 定義變量

double x0 = 1.0; // 初始值
double error = 1.0; // 誤差值
double tolerance = 1e-6; // 精度值
int n = 1; // 迭代次數

2.3  循環計算誤差值

使用迭代公式不斷逼近解,直到誤差值小於精度值為止

while (error > tolerance) {
    double term = x0; // 泰勒級數的第一項
    double x = x0; // 迭代得到的新的x值
    for (int i = 1; i <= 2*n+1; i++) {
        term *= -x0*x0/(i*(i+1)); // 計算泰勒級數的下一項
        x += term; // 累加泰勒級數的各項
    }
    error = Math.abs(x - x0); // 計算誤差值
    x0 = x; // 更新x0的值
    n++; // 迭代次數加1
}

2.4 完整java代碼實現

public class Main {
    public static void main(String[] args) {
        double x0 = 1.0; // 初始值
        double error = 1.0; // 誤差值
        double tolerance = 1e-6; // 精度值
        int n = 1; // 迭代次數
        while (error > tolerance) {
            double term = x0; // 泰勒級數的第一項
            double x = x0; // 迭代得到的新的x值
            for (int i = 1; i <= 2*n+1; i++) {
                term *= -x0*x0/(i*(i+1)); // 計算泰勒級數的下一項
                x += term; // 累加泰勒級數的各項
            }
            error = Math.abs(x - x0); // 計算誤差值
            x0 = x; // 更新x0的值
            n++; // 迭代次數加1
        }
        System.out.println("sin(x) = 0 的一個解為 x = " + x0);
    }
}

運行結果:

sin(x) = 0 的一個解為 x = 3.141592653589793

3 總結

說實話,做瞭這麼多年的開發,沒有去註重這些實現,都是直接使用api。真正哪天需要從基礎開始實現的時候,真的一頭霧水。

這幾天學瞭matlab,才知道自己知識多麼薄弱,往後需要大補啊。

以上就是sin(x)如何求解的java代碼實現方法的詳細內容,更多關於java sin(x)求解的資料請關註WalkonNet其它相關文章!

推薦閱讀: