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

其中x是橫坐標采樣值,y是縱坐標采樣值,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++) {
// 如果當前行對角線項為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
科學計算器在線使用_高級計算器在線計算:
http://tools.jb51.net/jisuanqi/jsqkexue
在線計算器_標準計算器:
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)文章
如何解決websocket開啟多個頁面訪問同一個連接會失效的問題
使用WebSocket時,若多個頁面訪問同一個WebSocket連接可能會導(dǎo)致連接失效,遇到這個問題時,可以通過在SpringBoot中使用@ServerEndpoint注解并添加@Component來解決,出現(xiàn)連接錯誤通常是因為WebSocket連接接收到的是一個GET請求2024-09-09
Spring context:component-scan的使用及說明
這篇文章主要介紹了Spring context:component-scan的使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
Springboot @WebFilter無法注入其他Bean的示例問題
這篇文章主要介紹了Springboot @WebFilter無法注入其他Bean的示例問題,本文通過示例代碼給大家分享解決方法,需要的朋友可以參考下2021-09-09
Java 11 正式發(fā)布,這 8 個逆天新特性教你寫出更牛的代碼
美國當?shù)貢r間9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布,可在生產(chǎn)環(huán)境中使用!這是自 Java 8 后的首個長期支持版本2018-09-09

