java解四元一次方程
2016-06-24 11:02
501 查看
问题:求解四元一次方程,例如
x+y-z=9;
x-y+2z=8;
2x+y-z=7;
x+y+z=m;
这个解是 x=-2.0 y=32.0 z=21.0 m=51.0
如果你想利用迭代暴力计算的话,不用试了,我替你试过了,太慢,慢的一天你也解不出来,比如x,y,z,m的范围是从-2.0到51.0
那么解决不了了吗?这时脑海中依稀想起来了大学学过线性代数,于是乎找美丽的度娘亲热了大半个下午,终于把线性代数这部分拾起来一部分o(╯□╰)o
顺便也帮大家温习下,先来个入门简单的
PS:或许好多客官认为这个温习没必要,傻逼才看呢,可是我想说,等你想拓展这个程序,想要解5元一次方程,n元一次方程的时候,你绝对用得着。但是如果你精通线代的话,算我没说。。。
然后再看下克拉默法则:
然后再看看代数余子式:
汗,最后步入正题,代码就简单了,其实就是套公式,看代码吧。。。
(注意要解的方程组把变量都放到左边,常亮放到右边,然后再写strss这个二维数组)
public
class ArithmeticOfCalcFour {
public
static void main(String[] args) {
// 例子
// x+y-z=9;
// x-y+2z=8;
// 2x+y-z=7;
// x+y+z=m;
// 解x=-2,y=32,z=21,m=51
double[][] strss={
{1,1,-1,0,9},
{1,-1,2,0,8},
{2,1,-1,0,7},
{1,1,1,-1,0},
};
calculate(strss);
//test();
}
public
static void calculate(double[][] strss) {
double[][] dss={
{strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
{strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
};
double[][] d1ss={
{strss[0][4],strss[0][1],strss[0][2],strss[0][3]},
{strss[1][4],strss[1][1],strss[1][2],strss[1][3]},
{strss[2][4],strss[2][1],strss[2][2],strss[2][3]},
{strss[3][4],strss[3][1],strss[3][2],strss[3][3]}
};
double[][] d2ss={
{strss[0][0],strss[0][4],strss[0][2],strss[0][3]},
{strss[1][0],strss[1][4],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][4],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][4],strss[3][2],strss[3][3]}
};
double[][] d3ss={
{strss[0][0],strss[0][1],strss[0][4],strss[0][3]},
{strss[1][0],strss[1][1],strss[1][4],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][4],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][4],strss[3][3]}
};
double[][] d4ss={
{strss[0][0],strss[0][1],strss[0][2],strss[0][4]},
{strss[1][0],strss[1][1],strss[1][2],strss[1][4]},
{strss[2][0],strss[2][1],strss[2][2],strss[2][4]},
{strss[3][0],strss[3][1],strss[3][2],strss[3][4]}
};
double d=calculateFour(dss);
if(d==0){
System.out.println("无解或多个解");
return ;
}
double d1=calculateFour(d1ss);
double d2=calculateFour(d2ss);
double d3=calculateFour(d3ss);
double d4=calculateFour(d4ss);
double x=d1/d;
double y=d2/d;
double z=d3/d;
double m=d4/d;
System.out.println("结果:x="+x+"y="+y+"z="+z+"m="+m);
System.out.println("计算完毕!");
}
/**
* 计算4阶线性方程组
* @param strss
* @return
*/
private
static double calculateFour(double[][] strss) {
// {strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
// {strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
// {strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
// {strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
double[][] t00={
{strss[1][1],strss[1][2],strss[1][3]},
{strss[2][1],strss[2][2],strss[2][3]},
{strss[3][1],strss[3][2],strss[3][3]}
};
double[][] t01={
{strss[1][0],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][2],strss[3][3]}
};
double[][] t02={
{strss[1][0],strss[1][1],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][3]}
};
double[][] t03={
{strss[1][0],strss[1][1],strss[1][2]},
{strss[2][0],strss[2][1],strss[2][2]},
{strss[3][0],strss[3][1],strss[3][2]}
};
double result=Math.pow(-1, 0+0)*strss[0][0]*calculateThree(t00)+ Math.pow(-1, 0+1)*strss[0][1]*calculateThree(t01) +
Math.pow(-1, 0+2)*strss[0][2]*calculateThree(t02)+ Math.pow(-1, 0+3)*strss[0][3]*calculateThree(t03) ;
return result;
}
/**
* 计算3阶行列式
* @param strss
* @return
*/
private
static double calculateThree(double[][] strss) {
// {strss[0][0],strss[0][1],strss[0][2]
// {strss[1][0],strss[1][1],strss[1][2]
// {strss[2][0],strss[2][1],strss[2][2]
double result=strss[0][0]*strss[1][1]*strss[2][2] + strss[0][1]*strss[1][2]*strss[2][0] + strss[0][2]*strss[1][0]*strss[2][1] +
-strss[0][2]*strss[1][1]*strss[2][0] -strss[0][1]*strss[1][0]*strss[2][2] - strss[0][0]*strss[2][1]*strss[1][2] ;
return result;
}
x+y-z=9;
x-y+2z=8;
2x+y-z=7;
x+y+z=m;
这个解是 x=-2.0 y=32.0 z=21.0 m=51.0
如果你想利用迭代暴力计算的话,不用试了,我替你试过了,太慢,慢的一天你也解不出来,比如x,y,z,m的范围是从-2.0到51.0
那么解决不了了吗?这时脑海中依稀想起来了大学学过线性代数,于是乎找美丽的度娘亲热了大半个下午,终于把线性代数这部分拾起来一部分o(╯□╰)o
顺便也帮大家温习下,先来个入门简单的
PS:或许好多客官认为这个温习没必要,傻逼才看呢,可是我想说,等你想拓展这个程序,想要解5元一次方程,n元一次方程的时候,你绝对用得着。但是如果你精通线代的话,算我没说。。。
然后再看下克拉默法则:
然后再看看代数余子式:
汗,最后步入正题,代码就简单了,其实就是套公式,看代码吧。。。
(注意要解的方程组把变量都放到左边,常亮放到右边,然后再写strss这个二维数组)
public
class ArithmeticOfCalcFour {
public
static void main(String[] args) {
// 例子
// x+y-z=9;
// x-y+2z=8;
// 2x+y-z=7;
// x+y+z=m;
// 解x=-2,y=32,z=21,m=51
double[][] strss={
{1,1,-1,0,9},
{1,-1,2,0,8},
{2,1,-1,0,7},
{1,1,1,-1,0},
};
calculate(strss);
//test();
}
public
static void calculate(double[][] strss) {
double[][] dss={
{strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
{strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
};
double[][] d1ss={
{strss[0][4],strss[0][1],strss[0][2],strss[0][3]},
{strss[1][4],strss[1][1],strss[1][2],strss[1][3]},
{strss[2][4],strss[2][1],strss[2][2],strss[2][3]},
{strss[3][4],strss[3][1],strss[3][2],strss[3][3]}
};
double[][] d2ss={
{strss[0][0],strss[0][4],strss[0][2],strss[0][3]},
{strss[1][0],strss[1][4],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][4],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][4],strss[3][2],strss[3][3]}
};
double[][] d3ss={
{strss[0][0],strss[0][1],strss[0][4],strss[0][3]},
{strss[1][0],strss[1][1],strss[1][4],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][4],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][4],strss[3][3]}
};
double[][] d4ss={
{strss[0][0],strss[0][1],strss[0][2],strss[0][4]},
{strss[1][0],strss[1][1],strss[1][2],strss[1][4]},
{strss[2][0],strss[2][1],strss[2][2],strss[2][4]},
{strss[3][0],strss[3][1],strss[3][2],strss[3][4]}
};
double d=calculateFour(dss);
if(d==0){
System.out.println("无解或多个解");
return ;
}
double d1=calculateFour(d1ss);
double d2=calculateFour(d2ss);
double d3=calculateFour(d3ss);
double d4=calculateFour(d4ss);
double x=d1/d;
double y=d2/d;
double z=d3/d;
double m=d4/d;
System.out.println("结果:x="+x+"y="+y+"z="+z+"m="+m);
System.out.println("计算完毕!");
}
/**
* 计算4阶线性方程组
* @param strss
* @return
*/
private
static double calculateFour(double[][] strss) {
// {strss[0][0],strss[0][1],strss[0][2],strss[0][3]},
// {strss[1][0],strss[1][1],strss[1][2],strss[1][3]},
// {strss[2][0],strss[2][1],strss[2][2],strss[2][3]},
// {strss[3][0],strss[3][1],strss[3][2],strss[3][3]}
double[][] t00={
{strss[1][1],strss[1][2],strss[1][3]},
{strss[2][1],strss[2][2],strss[2][3]},
{strss[3][1],strss[3][2],strss[3][3]}
};
double[][] t01={
{strss[1][0],strss[1][2],strss[1][3]},
{strss[2][0],strss[2][2],strss[2][3]},
{strss[3][0],strss[3][2],strss[3][3]}
};
double[][] t02={
{strss[1][0],strss[1][1],strss[1][3]},
{strss[2][0],strss[2][1],strss[2][3]},
{strss[3][0],strss[3][1],strss[3][3]}
};
double[][] t03={
{strss[1][0],strss[1][1],strss[1][2]},
{strss[2][0],strss[2][1],strss[2][2]},
{strss[3][0],strss[3][1],strss[3][2]}
};
double result=Math.pow(-1, 0+0)*strss[0][0]*calculateThree(t00)+ Math.pow(-1, 0+1)*strss[0][1]*calculateThree(t01) +
Math.pow(-1, 0+2)*strss[0][2]*calculateThree(t02)+ Math.pow(-1, 0+3)*strss[0][3]*calculateThree(t03) ;
return result;
}
/**
* 计算3阶行列式
* @param strss
* @return
*/
private
static double calculateThree(double[][] strss) {
// {strss[0][0],strss[0][1],strss[0][2]
// {strss[1][0],strss[1][1],strss[1][2]
// {strss[2][0],strss[2][1],strss[2][2]
double result=strss[0][0]*strss[1][1]*strss[2][2] + strss[0][1]*strss[1][2]*strss[2][0] + strss[0][2]*strss[1][0]*strss[2][1] +
-strss[0][2]*strss[1][1]*strss[2][0] -strss[0][1]*strss[1][0]*strss[2][2] - strss[0][0]*strss[2][1]*strss[1][2] ;
return result;
}
相关文章推荐
- Eclipse中打开java api源码的配置
- springMVC3学习(十)--注解式控制器
- 【深入Java虚拟机】之四:类加载机制
- JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
- 【深入Java虚拟机】之三:类初始化
- 技术文章 | JAVA学习基础入门
- springMVC3学习(九)--redirect和forward跳转
- Java线程及多线程技术及应用(一)
- java写文件
- Java数字字符串中怎么迭代每个数字
- JAVA动态编译
- springMVC3学习(八)--全局的异常处理
- springMVC3学习(七)--Interceptor拦截器
- springMVC3学习(六)--SimpleFormController
- springMVC3学习(五)--MultiActionController
- 【持久化框架】Mybatis与Hibernate的详细对比
- springMVC3学习(四)--访问静态文件如js,jpg,css
- 【深入Java虚拟机】之二:Class类文件结构
- 【项目管理和构建】十分钟教程,eclipse配置maven + 创建maven项目(三)
- springMVC3学习(二)--ModelAndView对象