介绍
这篇文章给大家介绍使用Java怎么求解一元n次多项式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
项目需要做趋势预测,采用线性拟合,2阶曲线拟合和指数拟合的算法,各种线性拟合算法写成矩阵大概是这么个形式:
其中x是横坐标采样值,y是纵坐标采样值,我是采样点序列号,一个是系数,n是采样点个数,n是阶数,所以线性拟合最后就转成了一个解高阶方程组的问题。
不知道有没有什么好用的Java矩阵运算的包,我很不擅长搜集这种资料,所以只好捡起了已经放下多年的线性代数,自己写了个Java程序用增广矩阵的算法来解高阶方程组。直接贴代码好了:
package commonAlgorithm; public class  PolynomialSoluter { private 才能;双[][],矩阵; private 才能;双[],结果; private 才能;int 秩序; public 才能;PolynomialSoluter (), { ,,}//,才能检查输入项长度并生成增广矩阵 private 才能;boolean  init(双[][],matrixA,,双[],arrayB), { ,,,order =, arrayB.length; ,,,if (matrixA.length !=,顺序) ,,,,,return 假; ,,,matrix =, new 双(顺序)(order +, 1); ,,,for (int 小姐:=,0;,小姐:& lt;,秩序;,我+ +),{ ,,,,,if (matrixA[我].length !=,顺序) ,,,,,,,return 假; ,,,,,for (int j =, 0;, j & lt;,秩序;,j + +), { ,,,,,,,矩阵[我][j],=, matrixA[我][j]; ,,,,,} ,,,,,矩阵[我](秩序),=,arrayB[我]; ,,,} ,,,result =, new 双(秩序); ,,,return 真实; ,,} public 才能;双[],getResult(双[][],matrixA,,双[],arrayB), { ,,,if (! init (matrixA, arrayB)) ,,,,,return 零; ,,,//,高斯消元——正向 ,,,for (int 小姐:=,0;,小姐:& lt;,秩序;,我+ +),{ ,,,,,//,如果当前行对角线项为0则与后面的同列项非0的行交换 ,,,,,if (! swithIfZero(我)) ,,,,,,,return 零; ,,,,,//,消元 ,,,,,for (int j =,小姐:+,1;,j & lt;,秩序;,j + +), { ,,,,,,,if (矩阵[j],[我]==,0) ,,,,,,,,,继续; ,,,,,,,double factor =,矩阵[j],[我]/,矩阵[我][我]; ,,,,,,,for (int l =,我,,l & lt;, order +, 1;, l + +) ,,,,,,,,,矩阵[j] [l],=,矩阵[j] [l],安康;矩阵[我][l], *,因素; ,,,,,} ,,,} ,,,//,高斯消元——反向——去掉了冗余计算 ,,,for (int 小姐:=,order 作用;1;,小姐:祝辞=,0;,我——),{ ,,,,,结果[我],=,矩阵[我](秩序),/,矩阵[我][我]; ,,,,,for (int j =,小姐:安康;1;,j 祝辞,1;,j——) ,,,,,,,矩阵[j](秩序),=,矩阵[j](秩序),安康;结果[我],*,矩阵[j][我]; ,,,} ,,,return 结果; ,,} private 才能;boolean  swithIfZero (int 我),{ ,,,if (矩阵[我][我],==,0),{ ,,,,,int j =,小姐:+,1; ,,,,,//,找到对应位置非0的列 ,,,,,while (j & lt;, order ,,,矩阵[j][我],==,0) ,,,,,,,+ +; ,,,,,//,若对应位置全为0则无解 ,,,,,if (==j 顺序) ,,,,,,,return 假; ,,,,, ,,,,,,,switchRows (i, j); ,,,} ,,,return 真实; ,,} private 才能;void  switchRows (int 我,int j), { ,,,双[],tmp =,矩阵[我]; ,,,矩阵[我],=,矩阵[j]; ,,,矩阵[j],=, tmp; ,,} }
关于使用Java怎么求解一元n次多项式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。