当前位置:首页 » 编程语言 » 曲线拟合的最小二乘法c语言

曲线拟合的最小二乘法c语言

发布时间: 2022-03-16 04:20:44

① 急~~~~~~!!!求解!用C语言编写最小二乘法求数据的拟合曲线~并做出图显示拟合效果!高分悬赏!

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

void Guass(int n,float Array[][10])
{
float s,u;
int i,j,k,a,x,y;
for(i=0;i<n-1;i++)
{
s=Array[i][i];
k=i;
for(a=i+1;a<n;a++)
{
if(fabs(s) < fabs(Array[a][i]))
{
s=Array[a][i];
k=a;
}
}
if(k!=i)
{
for(j=i;j<n+1;j++)
{
u=Array[i][j];Array[i][j]=Array[k][j];Array[k][j]=u;
}
}
for(x=i+1;x<n;x++)
{
u=Array[x][i]/s;
for(y=i;y<n+1;y++)
{
Array[x][y]=Array[x][y]-u*Array[i][y];
}
}
}
for(x=n-1;x>=0;x--)
{
s=0;
for(y=x+1;y<n;y++)
s=s+Array[x][y]*Array[y][n];
Array[x][n]=(Array[x][n]-s)/(Array[x][x]);//得到结果
}
for(i=0;i<n;i++)printf("%f ",Array[i][n]);printf("\n");
}

int main()
{
int n,i,j;
float Array[10][10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n+1;j++)
scanf("%f",&Array[i][j]);
}
Guass(n,Array);
return 0;
}
你的串号我已经记下,采纳后我会帮你制作

② 求C或C++语言编写的用最小二乘法进行曲线拟合

你的近似解析表达式为y=at+bt^2+ct^2
是不是想写成为y=at+bt^2+ct^3
但是实际拟合出来的表达式为y=a[3]+a[2]t+a[1]t^2+a[0]t^3会有个常数项的。
简单的讲,所谓拟合是指已知某函数的若干离散函数值{f1,f2,…,fn},通过调整该函数中若干待定系数f(λ1, λ2,…,λ3), 使得该函数与已知点集的差别(最小二乘意义)最小。如果待定函数是线性,就叫线性拟合或者线性回归(主要在统计中),否则叫作非线性拟合或者非线性回归。表达式也可以是分段函数,这种情况下叫作样条拟合。
曲线拟合:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3);
void main()
{
int i ,n ,m ;
double *x,*y,*a,dt1,dt2,dt3,b;
n = 12;// 12个样点
m = 4; //3次多项式拟合
b = 0; //x的初值为0
/*分别为x,y,a分配存贮空间*/
x = (double *)calloc(n,sizeof(double));
if(x == NULL)
{
printf("内存分配失败\n");
exit (0);
}
y = (double *)calloc(n,sizeof(double));
if(y == NULL)
{
printf("内存分配失败\n");
exit (0);
}
a = (double *)calloc(n,sizeof(double));
if(a == NULL)
{
printf("内存分配失败\n");
exit (0);
}
for(i=1;i<=n;i++)
{
x[i-1]=b+(i-1)*5;
/*每隔5取一个点,这样连续取12个点*/
}
y[0]=0;
y[1]=1.27;
y[2]=2.16;
y[3]=2.86;
y[4]=3.44;
y[5]=3.87;
y[6]=4.15;
y[7]=4.37;
y[8]=4.51;
y[9]=4.58;
y[10]=4.02;
y[11]=4.64;
/*x[i-1]点对应的y值是拟合已知值*/

Smooth(x,y,a,n,m,&dt1,&dt2,&dt3); /*调用拟合函数*/
for(i=1;i<=m;i++)
printf("a[%d] = %.10f\n",(i-1),a[i-1]);
printf("拟合多项式与数据点偏差的平方和为:\n");
printf("%.10e\n",dt1);
printf("拟合多项式与数据点偏差的绝对值之和为:\n");
printf("%.10e\n",dt2);
printf("拟合多项式与数据点偏差的绝对值最大值为:\n");
printf("%.10e\n",dt3);
free(x); /*释放存储空间*/
free(y); /*释放存储空间*/
free(a); /*释放存储空间*/
}

Smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3)//(x,y,a,n,m,dt1,dt2,dt3 )
//double *x; /*实型一维数组,输入参数,存放节点的xi值*/
//double *y; /*实型一维数组,输入参数,存放节点的yi值*/
//double *a; /*双精度实型一维数组,长度为m。返回m一1次拟合多项式的m个系数*/
//int n; /*整型变量,输入参数,给定数据点的个数*/
//int m; /*整型变量,输入参数,拟合多项式的项数*/
//double *dt1; /*实型变量,输出参数,拟合多项式与数据点偏差的平方和*/
//double *dt2; /*实型变量,输出参数,拟合多项式与数据点偏差的绝对值之和*/
//double *dt3; /*实型变量,输出参数,拟合多项式与数据点偏差的绝对值最大值*/
{
int i ,j ,k ;
double *s,*t,*b,z,d1,p,c,d2,g,q,dt;
/*分别为s ,t ,b分配存贮空间*/
s = (double *)calloc(n,sizeof(double));
if(s == NULL)
{
printf("内存分配失败\n");
exit (0);
}
t = (double *)calloc(n,sizeof(double));
if(t == NULL)
{
printf("内存分配失败\n");
exit (0);
}
b = (double *)calloc(n,sizeof(double));
if(b == NULL)
{
printf("内存分配失败\n");
exit (0);
}
z = 0;
for(i=1;i<=n;i++)
z=z+x[i-1]/n; /*z为各个x的平均值*/
b[0]=1;
d1=n;
p=0;
c=0;
for(i=1;i<=n;i++)
{
p=p+x[i-1]-z;
c=c+y[i-1];
}
c=c/d1;
p=p/d1;
a[0]=c*b[0];
if(m>1)
{
t[1]=1;
t[0]=-p;
d2=0;
c=0;
g=0;
for(i=1;i<=n;i++)
{
q=x[i-1]-z-p;
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
c=c/d2;
p=g/d2;
q=d2/d1;
d1=d2;
a[1]=c*t[1];
a[0]=c*t[0]+a[0];
}
for(j=3;j<=m;j++)
{
s[j-1]=t[j-2];
s[j-2]=-p*t[j-2]+t[j-3];
if(j>=4)
for(k=j-2;k>=2;k--)
s[k-1]=-p*t[k-1]+t[k-2]-q*b[k-1];
s[0]=-p*t[0]-q*b[0];
d2=0;
c=0;
g=0;
for(i=1;i<=n;i++)
{
q=s[j-1];
for(k=j-1;k>=1;k--)
q=q*(x[i-1]-z)+s[k-1];
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
c=c/d2;
p=g/d2;
q=d2/d1;
d1=d2;
a[j-1]=c*s[j-1];
t[j-1]=s[j-1];
for(k=j-1;k>=1;k--)
{
a[k-1]=c*s[k-1]+a[k-1];
b[k-1]=t[k-1];
t[k-1]=s[k-1];
}
}
*dt1=0;
*dt2=0;
*dt3=0;
for(i=1;i<=n;i++)
{
q=a[m-1];
for(k=m-1;k>=1;k--)
q=q*(x[i-1]-z)+a[k-1];
dt=q-y[i-1];
if(fabs(dt)>*dt3)
*dt3=fabs(dt);
*dt1=*dt1+dt*dt;
*dt2=*dt2+fabs(dt);
}
/*释放存储空间*/
free(s);
free(t);
free(b);
return(1);
}

③ 用C语言进行最小二乘法拟合,这个代码错在哪

a=(10.0*sumxy-sumx*sumy)/(10.0*sum-sumx*sumx); /*带入a=(NΣxy-ΣxΣy)/(NΣx^2(Σx)^2)

NΣx^2(Σx)^2 这边中间到底有没有减号?你注释里面没有减号,但是代码10.0*sum-sumx*sumx中是减法,你看看这边是否有问题

④ 最小二乘法 C程序算法

联系我,我可以把几种拟合方式的代码法给你

⑤ 几个最小二乘的曲线拟合的C/C++语言代码

曲线拟合的最小二乘法
如有实验数据如下
求x=55处的近似值 并画出图形
x 0 10 20 30 40 50 60 70 80 90
y 68 67.1 66.4 65.6 64.6 61.8 61.0 60.8 60.4 60
#include "stdio.h"
#include "graphics.h"
double s(double x[],double y[],double x1)
{
double a,b,tmp1=0,tmp2=0,tmp3=0,tmp4=0,result;
int i=0;
for(;i<10;i++)
{
tmp1+=x[i]*x[i];
tmp2+=y[i];
tmp3+=x[i];
tmp4+=x[i]*y[i];
}
b=(tmp1*tmp2-tmp3*tmp4)/(10*tmp1-tmp3*tmp3);
a=(10*tmp4-tmp2*tmp3)/(10*tmp1-tmp3*tmp3);
result=a*x1+b;
return result;
}
void hzbz(int x,int y)
{
int i,j;
line(0,y,1024,y);
moveto(x-200,y);
j=x-200;
for(i=0;i<100;i++)
{
if(i%5!=0)
lineto(j,y-5);
else
lineto(j,y-8);
j=j+10;
moveto(j,y);
}
line(x,768,x,0);
moveto(x,y+200);
j=y+640;
for(i=0;i<300;i++)
{
if(i%5!=0)
lineto(x+5,j);
else
lineto(x+8,j);
j=j-10;
moveto(x,j);
}
line(x,0,x-8,6);
line(x,0,x+8,6);
line(640,y,634,y-8);
line(640,y,634,y+8);
}
void main()
{
double x[]={0,10,20,30,40,50,60,70,80,90};
double y[]={68,67.1,66.4,65.6,64.6,61.8,61.0,60.8,60.4,60};
int graphdriver=DETECT,graphmode;
int i;
printf("x=55\ny=%lf\n",s(x,y,55));
getch();
initgraph(&graphdriver,&graphmode, "");
setbkcolor(BLUE);
hzbz(200,200);
moveto(200,200);
for(i=0;i<200;i++)
lineto(i+200,-s(x,y,i)+200);
getch();
closegraph();
}

⑥ 求最小二乘曲线的拟合的C语言程序

曲线拟合的最小二乘法
如有实验数据如下
求x=55处的近似值 并画出图形
x 0 10 20 30 40 50 60 70 80 90
y 68 67.1 66.4 65.6 64.6 61.8 61.0 60.8 60.4 60
#include "stdio.h"
#include "graphics.h"
double s(double x[],double y[],double x1)
{
double a,b,tmp1=0,tmp2=0,tmp3=0,tmp4=0,result;
int i=0;
for(;i<10;i++)
{
tmp1+=x[i]*x[i];
tmp2+=y[i];
tmp3+=x[i];
tmp4+=x[i]*y[i];
}
b=(tmp1*tmp2-tmp3*tmp4)/(10*tmp1-tmp3*tmp3);
a=(10*tmp4-tmp2*tmp3)/(10*tmp1-tmp3*tmp3);
result=a*x1+b;
return result;
}
void hzbz(int x,int y)
{
int i,j;
line(0,y,1024,y);
moveto(x-200,y);
j=x-200;
for(i=0;i<100;i++)
{
if(i%5!=0)
lineto(j,y-5);
else
lineto(j,y-8);
j=j+10;
moveto(j,y);
}
line(x,768,x,0);
moveto(x,y+200);
j=y+640;
for(i=0;i<300;i++)
{
if(i%5!=0)
lineto(x+5,j);
else
lineto(x+8,j);
j=j-10;
moveto(x,j);
}
line(x,0,x-8,6);
line(x,0,x+8,6);
line(640,y,634,y-8);
line(640,y,634,y+8);
}
void main()
{
double x[]={0,10,20,30,40,50,60,70,80,90};
double y[]={68,67.1,66.4,65.6,64.6,61.8,61.0,60.8,60.4,60};
int graphdriver=DETECT,graphmode;
int i;
printf("x=55\ny=%lf\n",s(x,y,55));
getch();
initgraph(&graphdriver,&graphmode, "");
setbkcolor(BLUE);
hzbz(200,200);
moveto(200,200);
for(i=0;i<200;i++)
lineto(i+200,-s(x,y,i)+200);
getch();
closegraph();
}

⑦ 用C语言拟合三角函数最小二乘法求实现代码

火热机会图裤裤盈亏开会研究与昆明

⑧ 曲线拟合 最小二乘法 C语言程序

去翻一下,计算方法或者数值分析的书吧。有公式,你按那公式求就可以了。

一楼用的是列主元消去法(跟高斯消去法差不多,就多了一个选主元(绝对值最大))

对于解AX=b,平方根法要求A是对称且正定矩阵
由于平方根法里面要计算根号,计算量就比较大,而且工程中的A不一定都是正定的。所以在工程中采用改进的平方根法(它解出来的解与真解有一点误差,但是相当相近),也就是说A只要对称就行了。

⑨ 最小二乘法c程序(个曲线拟合的问题,高手请指点)要求x是二次的!!)

请注意你的X的倒数第二个和倒数第三个可能写错了,应该是1.008,1.064吧?

如果不是这样,误差就很大了;

如果是这样,那么算出来的二次曲线是y = -10.263x2 + 34.745x - 0.3469;

看到你这么具体地给出一组数字,大概是需要具体结果而不是通用程序吧,我是直接用EXCEL拟合的,没写程序,不知道能满足你的需要吗;

热点内容
用户访问表空间 发布:2025-01-16 20:07:07 浏览:943
java代码自动编译 发布:2025-01-16 19:58:14 浏览:313
编程很困难 发布:2025-01-16 19:58:09 浏览:673
gg登录源码 发布:2025-01-16 19:58:07 浏览:292
微信收藏表情文件夹 发布:2025-01-16 19:28:57 浏览:15
ra服务器搭建 发布:2025-01-16 19:28:12 浏览:18
javaftp读取 发布:2025-01-16 19:28:02 浏览:185
乐课上传作业 发布:2025-01-16 19:24:58 浏览:936
哈尔滨python培训 发布:2025-01-16 19:19:30 浏览:915
java对象与线程 发布:2025-01-16 19:14:59 浏览:897