算法:n元一次方程求解。。。

gukuitian 2009-10-19 02:12:32
以下我写的,感觉有点麻烦,大伙帮俺弄个简单点的出来啊

public static double[] getF(double[][] p)
{
//二维数组的高,为0时为非法数据,
int h=p.length;
if(h==0) return null;

//二维数组的宽,不等于h+1时为非法数据,
int w=p[0].length;
if(w!=h+1) return null;

//中间变量,用于交换;
double[] temp=new double[w];

//结果
double[] result=new double[h];

//三层循环,下三角矩阵生成,
//分别用p[0][0],p[1][1],p[2][2]...化第0,1,2列的值为0
for(int k=0;k<h;k++)
{
for(int i=k+1;i<h;i++)
{
if(p[k][k]==0)
{
temp=p[i];
p[i]=p[k];
p[k]=temp;
}
if(p[i][k]==0)continue;
double a=p[k][k]/p[i][k];
for(int j=0;j<w;j++)
{
p[i][j]=-p[i][j]*a+p[k][j];
}
}
}

//对角矩阵生成
//分别用p[h-1][h-1],p[h-2][h-2],化第h-1,h-2列的值为0
for(int k=h;k>0;k--)
{
for(int i=k-1;i>0;i--)
{
if(p[i-1][k-1]==0 ||p[k-1][k-1]==0)continue;
double a=p[k-1][k-1]/p[i-1][k-1];
for(int j=w-1;j>=0;j--)
{
p[i-1][j]=-p[i-1][j]*a+p[k-1][j];
}
}
}

//判断是否有唯一解,没有则返回null
for(int i=0;i<h;i++)
{
if(zeroNum(p[i])!=1)
return null;
}
for(int i=0;i<h;i++)
{
result[i]=(p[i][w-1]/p[i][i]);
}
return result;
}
public static int zeroNum(double[] p)
{
int notZero=0;
for(int i=0;i<p.length-1;i++)
{
if(p[i]==0)
continue;
notZero++;
}
return notZero;
}
public static void main(String args[])
{
/**
* x1+x2+x3+x4=10
* x1+x2+x3-x4=2
* x1+x2-x3+x4=4
* x1-x2+x3+x4=6
* 的对应数组
*/
double[][] p = {
{1,1,1,1,10},
{1,1,1,-1,2},
{1,1,-1,1,4},
{1,-1,1,1,6}
};
double[] a=getF(p);
System.out.println(Arrays.toString(a));
}
...全文
735 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
丹青星辰 2011-07-21
  • 打赏
  • 举报
回复
学习了.....
丹青星辰 2011-07-21
  • 打赏
  • 举报
回复
学习了.....
24K純帥 2009-10-20
  • 打赏
  • 举报
回复
没想到什么别的方法up..
gukuitian 2009-10-20
  • 打赏
  • 举报
回复
其实我也并不非要一个多高效简洁的代码,就是想看看能有多少种思路,我只想出这一个
SimonYeung 2009-10-19
  • 打赏
  • 举报
回复
学习了 MARK
zl3450341 2009-10-19
  • 打赏
  • 举报
回复
楼主可以对照比较经典的代码对着 看看你的代码

学习了
gukuitian 2009-10-19
  • 打赏
  • 举报
回复
我原来还感觉自己C语言基础还可以,这C的代码竟然看不明白
getemail 2009-10-19
  • 打赏
  • 举报
回复
帮楼主顶贴
bolink5 2009-10-19
  • 打赏
  • 举报
回复
代码的简洁与程序运行需要的资源之间的平衡
这是牛人来解决的问题啊
个人觉得只有不是数据量特别大的话,一般来说还是可以接受的
swandragon 2009-10-19
  • 打赏
  • 举报
回复
来学习一下
捧剑者 2009-10-19
  • 打赏
  • 举报
回复
可以找一段C语言的Gauss消元法程序参考一下。
justinavril 2009-10-19
  • 打赏
  • 举报
回复
不知道你说的麻烦是指算法上,还是指代码上的繁琐。

一般来说,算法越有效,可能代码看上去就比较繁琐;而算法的效率不是很好,比如递归(我的意思不是说递归不是一个好方法),那么代码上看,可能很简洁。

因为这里存在这时间和空间的平衡问题。

如果你需要高效的算法,我想高数和数值分析上关于n元一次方程求解的问题早有了定论,可以参考下。
James__Zhan 2009-10-19
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<math.h>

float f(float x){
float y;
y = ((x - 8.0) * x + 12.0) * x - 30;
return y;
}

double xpoint(double x1, double x2){
double r, y1 = f(x1), y2 = f(x2);
r = (x1 * y2 - x2 * y1) / (y2 - y1);
return r;
}

double root(double x1, double x2){
double x, y, y1;
y1 = f(x1);
do{
x = xpoint(x1, x2);
y = f(x);
if(y*y1 > 0){
y1 = y;
x1 = x;
}else{
x2 = x;
}
}while(abs(y) >= 0.0001);
return x;
}

int main(void){
float x1, x2, f1, f2, x;
do{
printf("Please input x1, x2: \n");
scanf("%f, %f", &x1, &x2);
f1 = f(x1);
f2 = f(x2);
printf("f1=%f, f2=%f\n", f1, f2);
}while(f1 * f2 > 0 );
x = root(x1, x2);
printf("A root of equation is %9.6f\n", x);
}

来个n元一次C的,凑个热闹。
stamp80 2009-10-19
  • 打赏
  • 举报
回复
看看这个http://topic.csdn.net/t/20041121/14/3573524.html
gukuitian 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bigbro001 的回复:]
进来学习了...楼主大大可以给1分么?想在这个帖子作个记号方便以后查阅,非常感谢~
除了解n元一次方程,java可以用来求函数表达式最大值么?例如求解f(x,y)=2xy+2y-x*x-2y*y最大值?
[/Quote]
肯定是可以求的,现在不知道,让俺想想。。
bigbro001 2009-10-19
  • 打赏
  • 举报
回复
进来学习了...楼主大大可以给1分么?想在这个帖子作个记号方便以后查阅,非常感谢~
除了解n元一次方程,java可以用来求函数表达式最大值么?例如求解f(x,y)=2xy+2y-x*x-2y*y最大值?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧