sin(x)如何求解的java代碼實(shí)現(xiàn)方法
1 泰勒級(jí)數(shù)介紹
近期工作中需要使用matlab建模,期間做案例的時(shí)候有個(gè)方程:sin(x)=0,要求不使用現(xiàn)有api進(jìn)行求解,然后有點(diǎn)懵,不知道如何下手,最后翻了很多資料終于有點(diǎn)頭緒。有了java的解題思路,再把思路轉(zhuǎn)變?yōu)閟tateflow就簡(jiǎn)單了。
在數(shù)學(xué)中,泰勒級(jí)數(shù)用無(wú)限項(xiàng)連加式——級(jí)數(shù)來(lái)表示一個(gè)函數(shù),這些相加的項(xiàng)由函數(shù)在某一點(diǎn)的導(dǎo)數(shù)求得。泰勒級(jí)數(shù)是以于1715年發(fā)表了泰勒公式的英國(guó)數(shù)學(xué)家布魯克·泰勒的名字來(lái)命名的。通過(guò)函數(shù)在自變量零點(diǎn)的導(dǎo)數(shù)求得的泰勒級(jí)數(shù)又叫做麥克勞林級(jí)數(shù),以蘇格蘭數(shù)學(xué)家科林·麥克勞林的名字命名。 泰勒級(jí)數(shù)在近似計(jì)算中有重要作用。
定理
以下圖截取自百度百科。
泰勒級(jí)數(shù)的重要性體現(xiàn)在以下三個(gè)方面:
- 冪級(jí)數(shù)的求導(dǎo)和積分可以逐項(xiàng)進(jìn)行,因此求和函數(shù)相對(duì)比較容易。
- 一個(gè)解析函數(shù)可被延伸為一個(gè)定義在復(fù)平面上的一個(gè)開(kāi)區(qū)域上的泰勒級(jí)數(shù)通過(guò)解析延拓得到的函數(shù),并使得復(fù)分析這種手法可行。
- 泰勒級(jí)數(shù)可以用來(lái)近似計(jì)算函數(shù)的值。
2 sin(x)泰勒級(jí)數(shù)變換求解
2.1 將sin(x)展開(kāi)成泰勒級(jí)數(shù)的形式
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; // 迭代次數(shù)
2.3 循環(huán)計(jì)算誤差值
使用迭代公式不斷逼近解,直到誤差值小于精度值為止
while (error > tolerance) { double term = x0; // 泰勒級(jí)數(shù)的第一項(xiàng) double x = x0; // 迭代得到的新的x值 for (int i = 1; i <= 2*n+1; i++) { term *= -x0*x0/(i*(i+1)); // 計(jì)算泰勒級(jí)數(shù)的下一項(xiàng) x += term; // 累加泰勒級(jí)數(shù)的各項(xiàng) } error = Math.abs(x - x0); // 計(jì)算誤差值 x0 = x; // 更新x0的值 n++; // 迭代次數(shù)加1 }
2.4 完整java代碼實(shí)現(xiàn)
public class Main { public static void main(String[] args) { double x0 = 1.0; // 初始值 double error = 1.0; // 誤差值 double tolerance = 1e-6; // 精度值 int n = 1; // 迭代次數(shù) while (error > tolerance) { double term = x0; // 泰勒級(jí)數(shù)的第一項(xiàng) double x = x0; // 迭代得到的新的x值 for (int i = 1; i <= 2*n+1; i++) { term *= -x0*x0/(i*(i+1)); // 計(jì)算泰勒級(jí)數(shù)的下一項(xiàng) x += term; // 累加泰勒級(jí)數(shù)的各項(xiàng) } error = Math.abs(x - x0); // 計(jì)算誤差值 x0 = x; // 更新x0的值 n++; // 迭代次數(shù)加1 } System.out.println("sin(x) = 0 的一個(gè)解為 x = " + x0); } }
運(yùn)行結(jié)果:
sin(x) = 0 的一個(gè)解為 x = 3.141592653589793
3 總結(jié)
說(shuō)實(shí)話,做了這么多年的開(kāi)發(fā),沒(méi)有去注重這些實(shí)現(xiàn),都是直接使用api。真正哪天需要從基礎(chǔ)開(kāi)始實(shí)現(xiàn)的時(shí)候,真的一頭霧水。
這幾天學(xué)了matlab,才知道自己知識(shí)多么薄弱,往后需要大補(bǔ)啊。
以上就是sin(x)如何求解的java代碼實(shí)現(xiàn)方法的詳細(xì)內(nèi)容,更多關(guān)于java sin(x)求解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot+Spring?Data?JPA整合H2數(shù)據(jù)庫(kù)的示例代碼
H2數(shù)據(jù)庫(kù)是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù),本文重點(diǎn)給大家介紹SpringBoot+Spring?Data?JPA整合H2數(shù)據(jù)庫(kù)的示例代碼,感興趣的朋友跟隨小編一起看看吧2022-02-02Zuul 實(shí)現(xiàn)網(wǎng)關(guān)轉(zhuǎn)發(fā)的五種方式小結(jié)
這篇文章主要介紹了Zuul 實(shí)現(xiàn)網(wǎng)關(guān)轉(zhuǎn)發(fā)的五種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot整合Echarts實(shí)現(xiàn)數(shù)據(jù)大屏
這篇文章給大家介紹了三步實(shí)現(xiàn)SpringBoot全局日志記錄,整合Echarts實(shí)現(xiàn)數(shù)據(jù)大屏,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03如何使用pipeline和jacoco獲取自動(dòng)化測(cè)試代碼覆蓋率
這篇文章主要介紹了如何使用pipeline和jacoco獲取自動(dòng)化測(cè)試代碼覆蓋率,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問(wèn)題及解決方法
下面小編就為大家分享一篇基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問(wèn)題及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Spring的CorsFilter會(huì)失效的原因及解決方法
眾所周知CorsFilter是Spring提供的跨域過(guò)濾器,我們可能會(huì)做以下的配置,基本上就是允許任何跨域請(qǐng)求,我利用Spring的CorsFilter做跨域操作但是出現(xiàn)報(bào)錯(cuò),接下來(lái)小編就給大家介紹一Spring的CorsFilter會(huì)失效的原因及解決方法,需要的朋友可以參考下2023-09-09