⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpi.txt

📁 高次方程求解的一个程序
💻 TXT
字号:
#include"mpi.h"
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include"math.h"
double countf();
void inputeque();
void neque();
double countw();
void diveque();
void diedai();
double *headxi,*headlxi,*head2xi;
int *headmi,*headlmi,*head2mi;
#define LEN sizeof(double)
int m,k1,k2;
double x0,e;
int myid,numprocs;
void inputeque()
{
int i;
printf("\n 请输入高次方程非零项数m=");
scanf("%d",&m);
headxi=(double*)calloc(m,LEN);
headmi=(int*)calloc(m,sizeof(int));
printf("\n 请按降幂排列输入高次方程系数和幂:\n ");
for(i=0;i<=m-1;i++)
{
printf("\n %d:",i);
scanf("%lf",&(headxi[i]));
scanf("%d",&(headmi[i]));
}
printf("\n 请输入求解精度e=");
scanf("%lf",&e);
}
void diveque()
{
int i,j,k;
k1=0;
for(i=0;i<=m-1;i++)
if(headxi[i]>0)k1++;
k2=m-k1;
headlxi=(double*)calloc(k1,LEN);
head2xi=(double*)calloc(k2,LEN);
headlmi=(int*)calloc(k1,sizeof(int));
head2mi=(int*)calloc(k2,sizeof(int));
j=0,k=0;
for(i=0;i<=m-1;i++)
{
if(headxi[i]>0)
{
headlxi[j]=headxi[i]*headmi[i];
headlmi[j]=headmi[i]-1;
j++;
}
if(headxi[i]<0)
{
	head2xi[k]=fabs(headxi[i]*headmi[i]);
    head2mi[k]=headmi[i]-1;
    k++ ;
}
}
}
void neque()
{
int i;
for(i=0;i<=m-1;i++)
if(headmi[i]>0&&headmi[i]%2==1)headxi[i]=0-headxi[i];
}
double countw()
{
double w1,w=0.0,x,y;
int i;
for(i=1;i<=m-1;i++)
{
x=(double)headmi[0]*fabs(headxi[i]/headxi[0]);
y=1.0/(headmi[0]-headmi[i]);
w1=pow(x,y);
if(w1>w) w=w1;}
return(w);
}
double countf(double *p1,int *p2,int q)
{
int i,j;
double S;
S=p1[0];
for(i=1;i<=q-1;i++)
{
for(j=1;j<=(p2[i-1]-p2[i]);j++)
S=S*x0;
S=S+p1[i];
}
for(j=1;j<=p2[q-1];j++)
S=S*x0;
return(S);}
void diedai()
{
double f,f1,w1,w2,x2=0.0;
int i;
w1=countw();
if(numprocs-1==myid){
w2=w1*myid/numprocs;
w1=w1*(myid-1)/numprocs;
}else
{
w2=w1*myid/numprocs-e;
w1=w1*(myid-1)/numprocs;
}
printf("\n 处理机%d的根为:",myid);
for(i=1;i<=2;i++)
{
x0=w2;
while(x0>w1)
{
f=countf(headxi,headmi,m);
do{
if(f>0) f1=countf(headlxi,headlmi,k1);
else f1=countf(head2xi,head2mi,k2);
if(f1==0)break;
x0=x0-fabs(100*f*f1/(1+100*f1*f1));
f=countf(headxi,headmi,m);
}while(fabs(f)>e&&x0>w1);
if(f1==0)break ;
if(fabs(f)<=e) printf("%lf, ",(i==1)?x0:-x0);
x0=x0-e;}
free(headlmi);
free(headlxi);
free(head2mi);
free(head2xi);
neque();
diveque();
}
}
int main(int argc,char **argv)
{
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
if(myid==0)
{
	inputeque();
MPI_Bcast(&m,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(headxi,m,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD);
MPI_Bcast(headmi,m,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&e,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD);
}
else{
MPI_Bcast(&m,1,MPI_INT,0,MPI_COMM_WORLD);
headxi=(double*)calloc(m,LEN);
headmi=(int*)calloc(m,sizeof(int));
MPI_Bcast(headxi,m,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD);
MPI_Bcast(headmi,m,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(&e,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD);
diveque();
diedai();
}
MPI_Finalize();
return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -