Java實現(xiàn)求解一元n次多項式的方法示例
本文實例講述了Java實現(xiàn)求解一元n次多項式的方法。分享給大家供大家參考,具體如下:
項目需要做趨勢預(yù)測,采用線性擬合、2階曲線擬合和指數(shù)擬合的算法,各種線性擬合算法寫成矩陣大概是這么個形式:

其中x是橫坐標(biāo)采樣值,y是縱坐標(biāo)采樣值,i是采樣點序列號,a是系數(shù),N是采樣點個數(shù),n是階數(shù),所以線性擬合最后就轉(zhuǎn)成了一個解高階方程組的問題。
不知道有沒有什么好用的java矩陣運算的包,我很不擅長搜集這種資料,所以只好撿起了已經(jīng)放下多年的線性代數(shù),自己寫了個java程序用增廣矩陣的算法來解高階方程組。直接貼代碼好了:
package commonAlgorithm;
public class PolynomialSoluter {
private double[][] matrix;
private double[] result;
private int order;
public PolynomialSoluter() {
}
// 檢查輸入項長度并生成增廣矩陣
private boolean init(double[][] matrixA, double[] arrayB) {
order = arrayB.length;
if (matrixA.length != order)
return false;
matrix = new double[order][order + 1];
for (int i = 0; i < order; i++) {
if (matrixA[i].length != order)
return false;
for (int j = 0; j < order; j++) {
matrix[i][j] = matrixA[i][j];
}
matrix[i][order] = arrayB[i];
}
result = new double[order];
return true;
}
public double[] getResult(double[][] matrixA, double[] arrayB) {
if (!init(matrixA, arrayB))
return null;
// 高斯消元-正向
for (int i = 0; i < order; i++) {
// 如果當(dāng)前行對角線項為0則與后面的同列項非0的行交換
if (!swithIfZero(i))
return null;
// 消元
for (int j = i + 1; j < order; j++) {
if (matrix[j][i] == 0)
continue;
double factor = matrix[j][i] / matrix[i][i];
for (int l = i; l < order + 1; l++)
matrix[j][l] = matrix[j][l] - matrix[i][l] * factor;
}
}
// 高斯消元-反向-去掉了冗余計算
for (int i = order - 1; i >= 0; i--) {
result[i] = matrix[i][order] / matrix[i][i];
for (int j = i - 1; j > -1; j--)
matrix[j][order] = matrix[j][order] - result[i] * matrix[j][i];
}
return result;
}
private boolean swithIfZero(int i) {
if (matrix[i][i] == 0) {
int j = i + 1;
// 找到對應(yīng)位置非0的列
while (j < order && matrix[j][i] == 0)
j++;
// 若對應(yīng)位置全為0則無解
if (j == order)
return false;
else
switchRows(i, j);
}
return true;
}
private void switchRows(int i, int j) {
double[] tmp = matrix[i];
matrix[i] = matrix[j];
matrix[j] = tmp;
}
}
有更好的算法或者有合適的矩陣運算包歡迎交流
PS:這里再為大家推薦幾款計算工具供大家進一步參考借鑒:
在線一元函數(shù)(方程)求解計算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科學(xué)計算器在線使用_高級計算器在線計算:
http://tools.jb51.net/jisuanqi/jsqkexue
在線計算器_標(biāo)準(zhǔn)計算器:
http://tools.jb51.net/jisuanqi/jsq
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Mybatis-Plus自動填充更新操作相關(guān)字段的實現(xiàn)
數(shù)據(jù)庫表中應(yīng)該都要有create_time、update_time字段;那么在開發(fā)中,對于這些共有字段的處理應(yīng)該要進行統(tǒng)一,這樣就可以簡化我們的開發(fā)過程。那么本文就對Mybatis-Plus中的字段自動填充進行記錄2021-11-11
java 方法泛型入?yún)和String的重載關(guān)系詳解
這篇文章主要介紹了java 方法泛型入?yún)和String的重載關(guān)系詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Mybatis CachingExecutor二級緩存使用示例詳解
這篇文章主要介紹了?Mybatis的CachingExecutor與二級緩存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Spring Security實現(xiàn)基于角色的訪問控制框架
Spring Security是一個功能強大的安全框架,提供了基于角色的訪問控制、身份驗證、授權(quán)等安全功能,可輕松保護Web應(yīng)用程序的安全,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04
java使用短信設(shè)備發(fā)送sms短信的示例(java發(fā)送短信)
這篇文章主要介紹了java使用短信設(shè)備發(fā)送sms短信的示例(java發(fā)送短信),需要的朋友可以參考下2014-04-04
SpringBoot的API文檔生成工具SpringDoc使用詳解
這篇文章主要為大家介紹了SpringBoot的API文檔生成工具SpringDoc使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

