#include <stdio.h>
#include <math.h>
#include <string.h>
int p=4; //p为选定的拟合次数并加1,默认值为4,即拟合次数3
int t=5; //t为用户输入的数据的个数
void printa(double a[5][5])
{
int i,j;
for(j=1;j<=p;j++)
{
for(i=1;i<=p;i++)
{
printf("a[%d][%d]=%5.2e\t",j,i,a[j][i]);
}
printf("\n");
}
}
void printb(double b[5])
{
int i;
for(i=1;i<=p;i++)
{
printf("b[%d]=%5.2e\t",i,b[i]);
}
printf("\n");
}
main()
{
int i=1,j=1, k=1, r; //在程序中为中间变量来记录循环次数
double ss=0; // 在计算矩阵中未知参数的临时变量
double temp,m; //中间变量
double x[6]={0,5,10,15,20,25},y[6]={0,1.0029,1.0023,1.0000,0.9990,0.9983}; //x[]为用户输入的横坐标的值
double a[5][5]; //a[ ][ ] 记录在最小二乘算法中产生的系数矩阵
double b[5]; //常数矩阵的元素的值
for(i=1;i<=5;i++)
{
printf("x[%d]=%5.2e \t",i,x[i]);
}
printf("\n");
for(i=1;i<=5;i++)
{
printf("y[%d]=%5.2e \t",i,y[i]);
}
printf("\n");
//计算系数矩阵的每个元素 a[i][j]和a[j][i]
for(j=1;j<=p;j++) //p为选定的拟合次数并加1,默认值为4,即拟合次数3
{
for(i=1;i<=j;i++)
{
ss=0;
for( k=1;k<=t;k++)
{ //t为用户输入的数据的个数
ss=ss+pow(x[k],i+j-2);
} //x[]为用户输入的横坐标的值
a[i][j] = ss; //ss为临时变量
a[j][i]= ss;
} //a[ ][ ] 记录在最小二乘算法中产生的系数矩阵
}
printa(a);
//计算常数矩阵的每个元素的值
for(i=1;i<=p;i++)
{
ss=0;
for(k=1;k<=t;k++)
{
ss=ss+y[k]*pow(x[k],i-1);
} //y[ ]为用户的输入的纵坐标值
b[i] = ss;
}
printb(b);
//用Guass消去法解线性方程组
for(k=1;k<=p;k++)
{
m=fabs(a[k][k]);//计算a[k][k]的绝对值
r=k;
//选主元
for(i=k;i<=p;i++)
{
if( m<fabs(a[i][k]))
{
m=fabs(a[i][k]);
r=i;
}
}
if(r>k)
{ //交换两行
for(j=k;j<=p;j++)
{
temp=a[k][j];
a[k][j]=a[r][j];
a[r][j]=temp;
}
temp=b[k];
b[k]=b[r];
b[r]=temp;
}
//消元计算
for(j=k+1;j<=p;j++)
a[k][j]=a[k][j]/a[k][k];
b[k]=b[k]/a[k][k];
for(i=1;i<=p;i++)
{
if(i==k)
continue;
for(j=k+1;j<=p;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
for(i=1;i<=p;i++)
{
if(i==k)
continue;
b[i]=b[i]-a[i][k]*b[k];
}
}
//拟合多项式
printf("\nResult=");
for(i=1;i<=p;i++)
{
printf("%5.2e x^%d+\t",b[i],i-1);
}
}
结果看最后:
a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003 a[1][4]=
2.81e+004
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004 a[2][4]=
6.12e+005
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005 a[3][4]=
1.38e+007
a[4][1]=2.81e+004 a[4][2]=6.12e+005 a[4][3]=1.38e+007 a[4][4]=
3.21e+008
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003 b[4]=2.81e+004
Result=1.00e+000 x^0 4.42e-004 x^1 -5.69e-005 x^2 1.33e-006 x^3
========拟合次数2============
x[1]=5.00e+000 x[2]=1.00e+001 x[3]=1.50e+001 x[4]=2.00e+001 x[5]=2.50e+001
y[1]=1.00e+000 y[2]=1.00e+000 y[3]=1.00e+000 y[4]=9.99e-001 y[5]=9.98e-001
a[1][1]=5.00e+000 a[1][2]=7.50e+001 a[1][3]=1.38e+003
a[2][1]=7.50e+001 a[2][2]=1.38e+003 a[2][3]=2.81e+004
a[3][1]=1.38e+003 a[3][2]=2.81e+004 a[3][3]=6.12e+005
b[1]=5.00e+000 b[2]=7.50e+001 b[3]=1.37e+003
Result=1.00e+000 x^0+ -3.44e-004 x^1+ 3.14e-006 x^2+
温馨提示:内容为网友见解,仅供参考
跪求c语言高手,编条程序用来算5个坐标点的二次多项式拟合方程???急要...
double a[5][5];\/\/a[ ][ ] 记录在最小二乘算法中产生的系数矩阵 double b[5];\/\/常数矩阵的元素的值 for(i=1;i<=5;i++){ printf("x[%d]=%5.2e \\t",i,x[i]);} printf("\\n");for(i=1;i<=5;i++){ printf("y[%d]=%5.2e \\t",i,y[i]);} printf("\\n");\/...
想用C语言编写多项式拟合的程序
\/*===拟合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 ...
会C语言的朋友帮个忙啊 帮我编个小程序
案例三:采用c语言的结构体类型实现对单位的职工工资进行管理。包括可以显示职工的基本信息(以表格的形式),可以添加一个职工,可以修改职工的基本信息,可以统计职工的人数,统计每个职工的工资总数,计算月平均工资,(职务津贴,岗位津贴,地方补贴,补助等项目)。案例四:完成任意两个多项式的相加。例如:A: 3*x*x*x+5*x...
C语言如何实现二次曲线拟合
首先,谁都不能根据仅有的数据集来断定这就是什么曲线。我们只能通过对数据观察推测可能会符合什么形式的曲线。已知10个数据点的训练集,可以采用多项式拟合的办法来做,但是不建议使用C语言来实现。这种数学问题用matlab很容易就可以解决,c语言写要麻烦的多的多。比如你采用最小二乘法的话,你需要自己...
是不是每一个大型程序中都需要定义数据结构?不定义行不行
struct POINT{ double x; double y; double z; int color; POINT(double xi, double yi, double zi, int c) {x = xi; y = yi; z = zi; color = c;}};以后在程序中定义及使用一个坐标点只需要 POINT point(3,4,5,RED); cout<<point.x<<point.y<<point.z<...
用C语言写个程序判断两条线段的位置关系
double x;double y;};int main(){struct point a,b,c,d;double k1,k2,tempx;printf("input point a,b,c,d(坐标点x值延x轴正方向): \\n");scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);k1=(b.y-a.y)\/(b.x-a.x);k2...
用C语言在linux下编写一个五子棋程序!
关于盘面情况的表示,以链表形式表示当前盘面的情况,目的是可以允许用户进行悔棋、回退等操作。CList StepList;其中Step结构的表示为:struct Step { int m; \/\/m,n表示两个坐标值 int n;char side; \/\/side表示下子方 };以数组形式保存当前盘面的情况,目的是为了在显示当前盘面情况时使用:char ...
急啊,用c语言编程一个星号组成的沙漏图形,行数为n,如n=5是***就要代 ...
1、打开visual C++ 6.0-文件-新建-文件-C++ Source File。2、输入预处理命令和主函数:#include<stdio.h> \/*输入输出头文件*\/void main() \/*空类型:主函数*\/。3、定义变量并确定行数: int a,b,c=1,d=5,e=5; \/*定义变量的数据类型为整型*\/for(a=1;a<=5;a++) \/*...
用C语言编写窗口界面程序,应该学习什么?
然而,目前开发语言是如此地繁荣,就连微软也在推出了新的开发语言C#。一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,前段时间看了据说是微软操作系统源代码的东东,其中很多还是C语言。而在高阶程序设计领域,Java和C#正在不断蚕食着C++的地盘。也许Java和C#的狂潮...
c语言如何对若干离散点进行m阶多项式拟合
若你有 n 个点,就得到 n 个 方程式。若 n<m 有无穷解,若 n=m 有一解。通常 离散点的个数 远超过 方程阶数,也就是方程个数超出要解的未知数的个数,n>m,这时,通常 用 最小二乘法 求解 这个线性方程组。也就是所谓的拟合。最小二乘法 求解 这个线性方程组 的程序 网上(这里不敢...