java多元解析方程组
直接上代码:
static DecimalFormat df = new DecimalFormat("0.##");/**** 增广矩阵机型初等行变化的算法* * @param value* 需要算的增广矩阵* @return 计算的结果*/public static double[][] mathDeterminantCalculation(double[][] value)throws Exception {// 当矩阵的行数大于2时for (int i = 0; i < value.length; i++) {// 检查数组对角线位置的数值是否是0,如果是零则对该数组进行调换,查找到一行不为0的进行调换if (value[i][i] == 0) {value = changeDeterminantNoZero(value, i, i);}for (int j = 0; j < i; j++) {// 让开始处理的行的首位为0处理为三角形式// 如果要处理的列为0则和自己调换一下位置,这样就省去了计算if (value[i][j] == 0) {continue;}// 如果要是要处理的行是0则和上面的一行进行调换if (value[j][j] == 0) {double[] temp = value[i];value[i] = value[i - 1];value[i - 1] = temp;continue;}double ratio = -(value[i][j] / value[j][j]);value[i] = addValue(value[i], value[j], ratio);}}return value;}/**** 将i行之前的每一行乘以一个系数,使得从i行的第i列之前的数字置换为0* * @param currentRow* 当前要处理的行* @param frontRow* i行之前的遍历的行* @param ratio* 要乘以的系数* @return 将i行i列之前数字置换为0后的新的行*/public static double[] addValue(double[] currentRow, double[] frontRow,double ratio) throws Exception {for (int i = 0; i < currentRow.length; i++) {currentRow[i] += frontRow[i] * ratio;currentRow[i] = Double.parseDouble(df.format(currentRow[i]));}return currentRow;}/*** 指定列的位置是否为0,查找第一个不为0的位置的行进行位置调换,如果没有则返回原来的值* * @param determinant* 需要处理的行列式* @param line* 要调换的行* @param row* 要判断的列*/public static double[][] changeDeterminantNoZero(double[][] determinant,int line, int row) throws Exception {for (int j = line; j < determinant.length; j++) {// 进行行调换if (determinant[j][row] != 0) {double[] temp = determinant[line];determinant[line] = determinant[j];determinant[j] = temp;return determinant;}}return determinant;}/*** 将系数矩阵和方程值的矩阵进行合并成增广矩阵* * @param coefficient* 系数矩阵* @param value* 方程值* @return 增广矩阵*/public static double[][] transferMatrix(double[][] coefficient,double[] value) {double[][] temp = new double[coefficient.length][coefficient[0].length + 1];if (coefficient.length != value.length) {return temp;}// 将方程值添加到系数矩阵中for (int i = 0; i < coefficient.length; i++) {for (int j = 0; j < coefficient[0].length; j++) {temp[i][j] = coefficient[i][j];}}for (int i = 0; i < value.length; i++) {temp[i][temp[i].length - 1] = value[i];}return temp;}/*** 检查有效的行数,看非零行的个数* * @param value* 需要检查的数组* @return 非零行的个数*/public static int effectiveMatrix(double[][] value) {for (int i = value.length - 1; i > -1; i--) {for (int j = 0; j < value[i].length; j++) {if (value[i][j] != 0) {return i + 1;}}}return 0;}/*** 当方程组有解的时候计算方程组的解* * @param mathMatrix* 方程组的增广矩阵* @return 方程组的解*/private static double[] calculationResult(double[][] mathMatrix) {// 有解时方程组的个数等于方程组的未知数double[] result = new double[mathMatrix.length];for (int i = mathMatrix.length - 1; i > -1; i--) {double temp = 0;for (int j = mathMatrix[i].length; j > 0; j--) {// 第一个为方程的解,需要将解赋值给临时变量if (mathMatrix[i][j - 1] != 0) {if (j == mathMatrix[i].length) {temp = mathMatrix[i][j - 1];} else if (j - 1 > -1 && result[j - 1] != 0) {temp -= mathMatrix[i][j - 1] * result[j - 1];} else {result[i] = temp / mathMatrix[i][j - 1];continue;}}}}return result;}public static void main(String[] args) {/**// 方程的未知数的个数 int n = 3; // 系数矩阵 double[][] test = { { 2, 3, 1 }, { 1,1, 1 }, { 1, 2, -1 } };// 方程的解 double[] value = { 11, 6, 2 };方程组的解为x1=1.0 方程组的解为x2=2.0 方程组的解为x3=3.0*//**// 方程的未知数的个数 int n = 4;// 系数矩阵 double[][] test = { { 3, 1, -1, 1 },{ 1, -1, 1,2 }, {2,1,2,-1},{ 1,0, 2, 1 } };// 方程的解 double[] value ={ -3, 4, 7,6 };方程组的解为x1=1.0 方程组的解为x2=-2.0 方程组的解为x3=3.0 方程组的解为x4=-1.0*//**// 方程的未知数的个数 int n = 4;// 系数矩阵 double[][] test = { { 1, -3, 4, -5 },{ 1, -1, -1,2 }, {1,2,0,5},{ 2,-1, 3, -2 } };// 方程的解 double[] value ={ 0, 0, 0,0 };方程组有零解*/// 方程的未知数的个数 int n = 5;// 系数矩阵 double[][] test = { { 2,1, 1,1,1 },{ 1, 2, 1,1,1 }, {1,1,3,1,1},{ 1,1,1,4,1 },{1,1,1,1,5} };// 方程的解 double[] value ={ 4,5,9,0,-5 };try {// 转换成增广矩阵并进行初等行变化double[][] mathMatrix = mathDeterminantCalculation(transferMatrix(test, value));// 找出非零行的个数int checkMatrixRow = effectiveMatrix(mathMatrix);// 根据未知数的个数和方程组非零行的个数来判断当前方程组的解的情况if (n > checkMatrixRow) {System.out.println("未知数有" + n + "个,消元法后获取的阶梯方程组有"+ checkMatrixRow + "个方程,少于未知数个数,所以该方程有无数组解");} else if (n < checkMatrixRow) {System.out.println("未知数有" + n + "个,消元法后获取的阶梯方程组有"+ checkMatrixRow + "个方程,多于未知数个数,所以该方程有无解");} else {System.out.println("未知数有" + n + "个,消元法后获取的阶梯方程组有"+ checkMatrixRow + "个方程,等于未知数个数,所以该方程有解");double[] result = calculationResult(mathMatrix);for (int i = 0; i < result.length; i++) {System.out.println("方程组的解为x" + (i + 1) + "="+ df.format(result[i]));}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
参考地址:https://www.zdhoo.com/2018/07/01/NAryequation/
java多元解析方程组相关推荐
- json java typeof_java解析json
1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...
- Java XML解析工具 dom4j介绍及使用实例
Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...
- JAVA面试解析(有赞二面)
作者:孤独烟 来自:打杂的ZRJ 本文的题目出自博客 http://www.54tianzhisheng.cn/2018/07/12/youzan/ 但是作者没有给出答案,博主斗胆来制作答案版. 也是 ...
- Java XML解析器
使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...
- 如何在Java中解析命令行参数?
在Java中解析命令行参数的好方法是什么? #1楼 我不建议使用Apache Common CLI库,因为它是非线程安全的. 它使用带有静态变量和方法的有状态类来进行内部工作(例如OptionBuil ...
- Java泛型解析(02):通配符限定
Java泛型解析(02):通配符限定 考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil {public static <T> ...
- Java XML解析工具 JDOM介绍及使用实例
Java XML解析工具 JDOM JDOM介绍 JDOM是一种使用XML的独特Java工具包,用于快速开发XML应用程序. 它的设计包含Java语言的语法乃至语义. JDOM是一个开源项目,它基于树 ...
- Java动态解析域名
Java动态解析域名 Java提供InetAddress类,可以对域名-IP进行正向.逆向解析. InetAddress解析的时候一般是调用系统自带的DNS程序. linux 默认的DNS方式是读取/ ...
- Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
该文章是继Java注解解析-基础+运行时注解(RUNTIME)之后,使用注解处理器处理CLASS注解的文章.通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
最新文章
- Map json数据解析
- Rails全局处理Error
- View和ViewGroup常用方法
- linux下crontab allow,Linux下crontab命令的用法
- CSS之简单的双引号
- Django ModelForms
- 简单了解Tomcat与OSGi的类加载器架构
- MM模块采购收货的错误解决方案(2)
- word怎么恢复保存前的文件,word文件恢复
- RandomAccessSource not opened
- holdpwd php,PHPMyWind后台管理界面的SQL注入漏洞 - 网站安全
- 《Web全栈工程师的自我修养》读后感
- C语言程序软件电脑版,C语言宝典PC版-C语言宝典电脑版下载 v1.7.3--PC6电脑版
- 如何在Windows 7中管理操作中心
- U盘插上,在我的电脑中不显示盘符怎么办?
- 微前端架构实现(项目引入,消息总线,构建部署,监听服务)
- python图片合并代码
- 使用SQLAlchemy创建数据模型
- Window10中Dev-C++ 使用EasyX绘图库编程入门
- KM算法(汇总+模板)
热门文章
- redis和mecache和ehcache的特点
- Active Record Query Interface 数据查询接口(界面) 看到第8节。
- 插件 KSImageNamed 用图片时自动显示图片缩略图
- android调用webservice发送header身份验证不成功
- 雨林木风与微软数年博弈:蚂蚁和大象共舞
- Web应用开发平台 OpenJWeb
- 计算机应用基础图表填空,计算机应用基础填空题.doc
- mysql的select的排序_mysql数据分组和排序及SELECT子句顺序
- java writebytes()_Java ObjectOutputStream writeBytes()方法与示例
- android无缝切换播放器,android 视频 无缝切换 无缝播放 surfaceview