| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2673 人关注过本帖
标题:[讨论][挑战]解方程程序
取消只看楼主 加入收藏
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
 问题点数:0 回复次数:6 
[讨论][挑战]解方程程序
题目描述
f(x)=a[n]*x^n+a[n-1]*x^(n-1)+......a[0]*x^0
是一个一元N次的多项式,问题是编写一个程序,能够解出方程f(x)=0的所有解,精确到0,01;
程序越完善越好哦.
输入:
一个整数N
接下来输入N个实数,分别对应a[n],a[n-1].....a[0],系数为0也照常输入

请大家说说自己的思路.
如果可能试下写个程序.

该问题简化版本:N=3.如果任意N不会可以先做这个..
搜索更多相关主题的帖子: 解方程 挑战 
2006-07-19 14:40
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 

是的,但是这第一个也不太容易解


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-07-20 10:00
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
无解需要判断无解

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-07-26 08:05
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
以下是引用ysol在2006-7-26 13:32:25的发言:

无解算不算所有解??????你的那点数学常识不要在我面前显摆,起码在你连我的基本意思都没有搞清楚之前不要说一些不经过大脑考虑的话。

无解的判断实际上可以放在寻找ab的过程中,设定经过一定数量级的2分插值还不能满足f(a)>0,f(b)<0基本上可以判断在
区间[a,b]上无实根,方程的求解过程关键在于预测该方程的解区间也就是a,b的值的确定。这只是简单的解方程思想。

如果要精确的求解恐怕要用到拉格朗日多项式插值公式和矩阵,特别是Vandermonde矩阵或者Toeplitz矩阵,可惜Vandermonde问题本身是一个严重病态的,解搂主的方程个人感觉最好用Toeplitz矩阵,不过问题是相当的........................哈哈!楼主要是有兴趣可以共同探讨!!


不好意思,我高中刚毕业,微积分知识很单薄,所以对你说的东西不懂,能不能说稍微明白些呢?


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-07-26 16:59
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
我对第二种方法感兴趣
高数我是懂得一点的,只是不多也不熟练罢了
楼上既然说了这么多有没兴趣写一个,我们比比?

[此贴子已经被作者于2006-7-27 8:19:53编辑过]


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-07-27 08:19
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
发个自己的解,对于n比较小的方程应该没问题,大的的话不敢说,从文件input.txt输入
具体思路是用二分求解,但是为了保证求到所有的解就必须要选好分割点,其实分割点可以选每个极大点和极小点及无穷远点,求极点的问题转化到求f'(x)=0

#include <stdio.h>
#include <math.h>
#define Rmax 11
#define K 0.0001
double eq[Rmax][Rmax];
double so[Rmax][Rmax];
int snum[Rmax];
double f(double b[],int rmax,double x)
{
double ans=b[rmax];
while(rmax--)
ans=ans*x+b[rmax];
return ans;
}
double getx(double b[],int rmax,double l,double r)
{
char sl,sr,sm;
double m;
sl=f(b,rmax,l)>0;sr=f(b,rmax,r)>0;
m=(l+r)/2;sm=f(b,rmax,m)>0;
while((l+K)<=r){
if(sl^sm){ r=m;sr=sm; }
else { l=m;sl=sm; }
m=(l+r)/2;sm=f(b,rmax,m)>0;
}
if(sm) return m;
else
if(sr) return r;
else return l;
}
double findmax(double b[],int rmax,double st,double p)
{
char smax=((p>0)||!(rmax&1))^(b[rmax]<0);
while((f(b,rmax,st+p)>0)^smax)
p*=2;
return (st+p);
}
FILE *fi,*fo;
void init(int n)
{
int i,j;
for(i=n;i>=0;i--)
fscanf(fi,"%lf",&eq[n][i]);
for(i=n-1;i>=1;i--)
for(j=i+1;j>=1;j--)
eq[i][j-1]=eq[i+1][j]*j;
}
void printans(double b[],int rmax,double s[],int num)
{
int i,t=rmax;
fprintf(fo,"The answer of equation:");
fprintf(fo,"%.2lfx^%d",b[rmax],rmax);
while(--rmax)
if(b[rmax]>0) fprintf(fo,"+%.2lfx^%d",b[rmax],rmax);
else if(b[rmax]<0) fprintf(fo,"%.2lfx^%d",b[rmax],rmax);
if(b[0]>0) fprintf(fo,"+%.2lf",b[0]);
else if(b[0]<0) fprintf(fo,"%.2lf",b[0]);
fprintf(fo,"=0\n");
if(num)
for(i=0;i<num;i++)
fprintf(fo,"%.2lf %.2f\n",s[i],f(b,t,s[i]));
else fprintf(fo,"No solution\n");
fprintf(fo,"\n");
}
void addx(double s[],int *num,double x)
{
if((*num)&&fabs(x-s[(*num)-1])<K) return;
s[(*num)++]=x;
}
#define Ok(a,b) (f(eq[i],i,a)>0)^(f(eq[i],i,b)>0)
void work(int n)
{
int i,j,num,t;
double x1,x2;
snum[1]=1;so[1][0]=-(eq[1][0]/eq[1][1]);
for(i=2;i<=n;i++){
num=snum[i-1];
if(!num){
x1=findmax(eq[i],i,0,-1);
x2=findmax(eq[i],i,0,1);
if(i&1){ so[i][0]=getx(eq[i],i,x1,x2); snum[i]=1;}
else snum[i]=0;
}
else{
snum[i]=0;
x1=findmax(eq[i],i,so[i-1][0],-1);
x2=findmax(eq[i],i,so[i-1][num-1],1);
if(Ok(x1,so[i-1][0]))
addx(so[i],&snum[i],getx(eq[i],i,x1,so[i-1][0]));
for(j=1;j<num;j++)
if(Ok(so[i-1][j-1],so[i-1][j])) {
addx(so[i],&snum[i],getx(eq[i],i,so[i-1][j-1],so[i-1][j]));
}
if(Ok(x2,so[i-1][num-1]))
addx(so[i],&snum[i],getx(eq[i],i,so[i-1][num-1],x2));
}
}
printans(eq[n],n,so[n],snum[n]);
}
int main(void)
{
int n;
fi=fopen("input.txt","r");
fo=stdout;
while(fscanf(fi,"%d",&n)==1){
init(n);work(n);
}
fclose(fi);getch();
return 0;
}

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-08-12 08:08
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
!(rmax&1) 不是恒0的,注意用了&位运算而不是&&,这一句是判断rmax是否为偶数,
插值多项式到矩阵的变换吗?注释的话我有空加上吧

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2006-08-12 17:33
快速回复:[讨论][挑战]解方程程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031997 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved