#includestdio.h
成都创新互联公司于2013年成立,先为贡嘎等服务建站,贡嘎等地企业,进行企业商务咨询服务。为贡嘎企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
#includemath.h
int main()
{
double a,b,c,x1,x2,d;
scanf("%lf%lf%lf",a,b,c);
if(a==0)
{
if(b==0)
{
if(0==c)
{
printf("恒等式:0+0+0=0\n");
}
else
{
printf("输入错误,不能构成等式!\n");
}
}
else
{
printf("只能构成一元一次方程,x=%.2lf\n",0==-(double)c/b ? 0 : -(double)c/b);
}
}
else
{
d=b*b-4*a*c;
if(d0)
{
printf("x1=%.2lf+%.2lfi\nx2=%.2lf-%.2lfi\n",(-b)/(2.0*a),sqrt(-d)/(2.0*a),(-b)/(2.0*a),sqrt(-d)/(2.0*a));
}
else if(d==0)
{
printf("x1=x2=%.2lf\n",(-b)/(2.0*a));
}
else
{
x1=(-b+sqrt(d))/(2.0*a);
x2=(-b-sqrt(d))/(2.0*a);
printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
}
}
return 0;
}
你的意思是说,输入一些数据,让程序拟合出来一个函数。
这个很复杂。比如我举个例子。
多项式拟合函数polyfit之C语言的源码
2010-11-25 10:05:57| 分类: VC++编程 | 标签:double poly_n polyfit int for |字号 订阅
#include stdio.h
#include conio.h
#include stdlib.h
#include math.h
main()
{
int i,j,m,n=7,poly_n=2;
double x[7]={1,2,3,4,6,7,8},y[7]={2,3,6,7,5,3,2};
double a[3];
void polyfit(int n,double *x,double *y,int poly_n,double a[]);
system("cls");
polyfit(n,x,y,poly_n,a);
for (i=0;ipoly_n+1;i++)/*这里是升序排列,Matlab是降序排列*/
printf("a[%d]=%g\n",i,a[i]);
getch();
}
/*==================polyfit(n,x,y,poly_n,a)===================*/
/*=======拟合y=a0+a1*x+a2*x^2+……+apoly_n*x^poly_n========*/
/*=====n是数据个数 xy是数据值 poly_n是多项式的项数======*/
/*===返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)=====*/
void polyfit(int n,double x[],double y[],int poly_n,double a[])
{
int i,j;
double *tempx,*tempy,*sumxx,*sumxy,*ata;
void gauss_solve(int n,double A[],double x[],double b[]);
tempx=calloc(n,sizeof(double));
sumxx=calloc(poly_n*2+1,sizeof(double));
tempy=calloc(n,sizeof(double));
sumxy=calloc(poly_n+1,sizeof(double));
ata=calloc((poly_n+1)*(poly_n+1),sizeof(double));
for (i=0;in;i++)
{
tempx[i]=1;
tempy[i]=y[i];
}
for (i=0;i2*poly_n+1;i++)
for (sumxx[i]=0,j=0;jn;j++)
{
sumxx[i]+=tempx[j];
tempx[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (sumxy[i]=0,j=0;jn;j++)
{
sumxy[i]+=tempy[j];
tempy[j]*=x[j];
}
for (i=0;ipoly_n+1;i++)
for (j=0;jpoly_n+1;j++)
ata[i*(poly_n+1)+j]=sumxx[i+j];
gauss_solve(poly_n+1,ata,a,sumxy);
free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}
void gauss_solve(int n,double A[],double x[],double b[])
{
int i,j,k,r;
double max;
for (k=0;kn-1;k++)
{
max=fabs(A[k*n+k]); /*find maxmum*/
r=k;
for (i=k+1;in-1;i++)
if (maxfabs(A[i*n+i]))
{
max=fabs(A[i*n+i]);
r=i;
}
if (r!=k)
for (i=0;in;i++) /*change array:A[k]A[r] */
{
max=A[k*n+i];
A[k*n+i]=A[r*n+i];
A[r*n+i]=max;
}
max=b[k]; /*change array:b[k]b[r] */
b[k]=b[r];
b[r]=max;
for (i=k+1;in;i++)
{
for (j=k+1;jn;j++)
A[i*n+j]-=A[i*n+k]*A[k*n+j]/A[k*n+k];
b[i]-=A[i*n+k]*b[k]/A[k*n+k];
}
}
所以这种程序是超级大型的,一般没人能独立写出来。
编程计算器和一些程序能实现,但是源代码都是不公布的。
/*
供参考!
*/
# include stdio.h
# include math.h
void calcu(double a,double b,double c);
int main(void)
{
double a, b, c;
char ch;
do
{
printf("请输入一元二次方程的三个系数:\n");
printf("a=\t");
scanf("%lf", a);
printf("b=\t");
scanf("%lf", b);
printf("c=\t");
scanf("%lf", c);
calcu(a,b,c);
printf("继续(Y/y),输入其他退出: ");
scanf(" %c", ch);
printf("\n");
} while ('y'==ch || 'Y'==ch);
printf("成功退出!\n");
return 0;
}
void calcu(double a,double b,double c)
{
double delta;
double x1, x2;
delta = b*b - 4*a*c;
if (delta 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("有两个解,x1 = %lf, x2 = %lf\n", x1, x2);
}
else if (0 == delta)
{
x1 = x2 = (-b) / (2*a);
printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
}
else
{
printf("无实数解!\n");
}
}
/*
在c++6.0中的运行结果是:
-------------------------
请输入一元二次方程的三个系数:
a= 1
b= -3
c= 2
有两个解,x1 = 2.000000, x2 = 1.000000
继续(Y/y),输入其他退出: y
请输入一元二次方程的三个系数:
a= 1
b= 1
c= 1
无实数解!
继续(Y/y),输入其他退出: y
请输入一元二次方程的三个系数:
a= 1
b= -2
c= 1
有唯一解,x1 = x2 = 1.000000
继续(Y/y),输入其他退出: n
成功退出!
--------------------------------
*/