c语言实现最小二乘法(最小二乘法函数)

本篇文章给大家谈谈c语言实现最小二乘法,以及最小二乘法函数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、单片机c语言的最小二乘法怎么实现,求代码2、计算方法中最小二乘法如何用C语言编程3、用C语言编写最小二乘法线性拟合4、关于最小二乘法的c语言程序5、求一个最小二乘法C语言程序6、c语言最小二乘法 求助

单片机c语言的最小二乘法怎么实现,求代码

#include stdio.h

void main ()

{

int num,i;

float x,y,l,m,n,p,a,b;

i=1;

l=0.0;

m=0.0;

n=0.0;

p=0.0;

printf (“请输入你想计算的x,y的个数:”);

scanf(“%d”,num);

if (num=1)

{

while (i=num);

{

printf(“请输入x的值”);

scanf (“%lf”,x);

printf(“请输入y的值”);

scanf (“%lf”,y);

l+=x;

m+=y;

n+=x*y;

p+=x*x;

i++;

}

a=(num*n-l*m)/(num*p-l*l);

b=(p*m-n*l)/(num*p-l*l);

printf(“最小二乘法所算得的斜率和截距分别为%f和%f\n”,a,b);

}

else printf(“mun”输入有误!);

}

计算方法中最小二乘法如何用C语言编程

#include stdio.h

#include math.h

#define epsilon 1e-6

void nihe1(int n,int m,float sum_x,float sum_y,float sum_xy,float x2);

void nihe2(int n,int m,float sum_x,float sum_y,float sum_xy,float x2,float x2y,float x3,float x4);

int main(){

float x[100]={0.0};

float y[100]={0.0};

int n,i,flag=1;

float sum_y=0.0,sum_x=0,x2=0,sum_xy=0.0,x3=0,x4=0,x2y=0.0;

printf(“请你输入需要测试的数据(先输入x[],后输入y[])的个数:”);

scanf(“%d”,n);

for(i = 0; i n; i++){

scanf(“%f”,x[i]);}

for(i = 0; i n; i++){

scanf(“%f”,y[i]);}

for(i = 0; i n; i++){

sum_x += x[i];

sum_y += y[i];

sum_xy += x[i]*y[i];

x2 += x[i]*x[i];

x2y += x[i]*x[i]*y[i];

x3 += x[i]*x[i]*x[i];

x4 += x[i]*x[i]*x[i]*x[i];}

printf(“—————请你输入的要拟合的函数——————\n”);

printf(” 1、拟合一次函数\n”);

printf(” 2、拟合二次函数\n”);

scanf(“%d”,flag);

switch(flag){

case 1:

nihe1(n,flag+1,sum_x,sum_y,sum_xy,x2); break;

case 2:

nihe2(n,flag+1,sum_x,sum_y,sum_xy,x2,x2y,x3,x4); break;

default:

printf(“ERROR\n”);}

return 0;}

void nihe1(int n,int m,float sum_x,float sum_y,float sum_xy,float x2){

int i,k,j;

float t,s=0;

float a[2][3] = {{(float)n,sum_x,sum_y},{sum_x,x2,sum_xy}};

n=m;

//if(m == 3)

// a[3][4] = {{n,sum_x,sum_y},{sum_x,x2,x3,sum_xy},{x2,x3,x4,x2y}};

for(k=0;kn-1;k++) {

for(i=k+1;in;i++)

if( abs((int)a[i][k]) abs((int)a[k][k]) )

for(j=k;jn+1;j++) {

t=a[k][j];

a[k][j]=a[i][j];

a[i][j]=t; }

if( abs((int)a[k][k]) epsilon) {

printf(“\nError,主元消去法 cann’t be durable,break at %d!\n”,k+1);

return; }

for(i=k+1;in;i++){

a[i][k]=a[i][k] / a[k][k];

for(j=k+1;jn+1;j++)

a[i][j]=a[i][j]-a[i][k] * a[k][j]; }}

a[n-1][n]=a[n-1][n] / a[n-1][n-1];

for(k=n-2;k=0;k–) {

s=0;

for(j=k+1;jn;j++)

s+=a[k][j]*a[j][n];

a[k][n]=( a[k][n]-s ) / a[k][k]; }

printf(“\n*****The Result*****\n”);

for(i=0;in;i++)

printf(” x[%d]=%.4f\n”,i+1,a[i][n]);

printf(“函数为:p(x) = %.4f + (%.4f)*x\n”,a[0][n],a[1][n]);

getchar();}

void nihe2(int n,int m,float sum_x,float sum_y,float sum_xy,float x2,float x2y,float x3,float x4){

int i,k,j;

float t,s=0;

float a[3][4]=

{{(float)n,sum_x,x2,sum_y},{sum_x,x2,x3,sum_xy},{x2,x3,x4,x2y}};

n=m;

for(k=0;kn-1;k++) {

for(i=k+1;in;i++)

if( abs((int)a[i][k]) abs((int)a[k][k]) )

for(j=k;jn+1;j++) {

t=a[k][j];

a[k][j]=a[i][j];

a[i][j]=t; }

if( abs((int)a[k][k]) epsilon) {

printf(“\nError,主元消去法 cann’t be durable,break at %d!\n”,k+1);

return; }

for(i=k+1;in;i++){

a[i][k]=a[i][k] / a[k][k];

for(j=k+1;jn+1;j++)

a[i][j]=a[i][j]-a[i][k] * a[k][j]; } }

a[n-1][n]=a[n-1][n] / a[n-1][n-1];

for(k=n-2;k=0;k–) {

s=0;

for(j=k+1;jn;j++)

s+=a[k][j]*a[j][n];

a[k][n]=( a[k][n]-s ) / a[k][k]; }

printf(“\n*****The Result*****\n”);

for(i=0;in;i++)

printf(” x[%d]=%.4f\n”,i+1,a[i][n]);

printf(“函数为:p(x) = %.4f + (%.4f)*x + (%.4f)*x*x\n”,a[0][n],a[1][n],a[2][n]);

getchar();}

用C语言编写最小二乘法线性拟合

首先你要知道最小二乘法的公式,然后使用数组实现。比如定义数组double x[10]代表十个横坐标,double y[10]代表纵坐标,然后套公式用循环计算

c语言实现最小二乘法(最小二乘法函数)

关于最小二乘法的c语言程序

已经改正语法的错误,如果有问题

是你的算法有误

#include

int

main

()

{

int

num,i;

float

x,y,l,m,n,p,a,b;

i=1;

l=0.0;

m=0.0;

n=0.0;

p=0.0;

printf

(“请输入你想计算的x,y的个数:”);

scanf(“%d”,num);

while

(i=num)

//去掉分号

{

printf(“请输入x的值:”);

scanf

(“%f”,x);

//加上取地址符

printf(“请输入y的值:”);

scanf

(“%f”,y);

//加上取地址符

l+=x;

m+=y;

n+=x*y;

p+=x*x;

i++;

}

a=(num*n-l*m)/(num*p-l*l);

b=(p*m-n*l)/(num*p-l*l);

printf(“最小二乘法所算得的斜率和截距分别为%f和%f\n”,a,b);

}

求一个最小二乘法C语言程序

#include stdio.h

#include conio.h

#include math.h

#include process.h

#define N 5//N个点

#define T 3 //T次拟合

#define W 1//权函数

#define PRECISION 0.00001

float pow_n(float a,int n)

{

int i;

if(n==0)

return(1);

float res=a;

for(i=1;in;i++)

{

res*=a;

}

return(res);

}

void mutiple(float a[][N],float b[][T+1],float c[][T+1])

{

float res=0;

int i,j,k;

for(i=0;iT+1;i++)

for(j=0;jT+1;j++)

{

res=0;

for(k=0;kN;k++)

{

res+=a[i][k]*b[k][j];

c[i][j]=res;

}

}

}

void matrix_trans(float a[][T+1],float b[][N])

{

int i,j;

for(i=0;iN;i++)

{

for(j=0;jT+1;j++)

{

b[j][i]=a[i][j];

}

}

}

void init(float x_y[][2],int n)

{

int i;

printf(“请输入%d个已知点:\n”,N);

for(i=0;in;i++)

{

printf(“(x%d y%d):”,i,i);

scanf(“%f %f”,x_y[i][0],x_y[i][1]);

}

}

void get_A(float matrix_A[][T+1],float x_y[][2],int n)

{

int i,j;

for(i=0;iN;i++)

{

for(j=0;jT+1;j++)

{

matrix_A[i][j]=W*pow_n(x_y[i][0],j);

}

}

}

void print_array(float array[][T+1],int n)

{

int i,j;

for(i=0;in;i++)

{

for(j=0;jT+1;j++)

{

printf(“%-g”,array[i][j]);

}

printf(“\n”);

}

}

void convert(float argu[][T+2],int n)

{

int i,j,k,p,t;

float rate,temp;

for(i=1;in;i++)

{

for(j=i;jn;j++)

{

if(argu[i-1][i-1]==0)

{

for(p=i;pn;p++)

{

if(argu[p][i-1]!=0)

break;

}

if(p==n)

{

printf(“方程组无解!\n”);

exit(0);

}

for(t=0;tn+1;t++)

{

temp=argu[i-1][t];

argu[i-1][t]=argu[p][t];

argu[p][t]=temp;

}

}

rate=argu[j][i-1]/argu[i-1][i-1];

for(k=i-1;kn+1;k++)

{

argu[j][k]-=argu[i-1][k]*rate;

if(fabs(argu[j][k])=PRECISION)

argu[j][k]=0;

}

}

}

}

void compute(float argu[][T+2],int n,float root[])

{

int i,j;

float temp;

for(i=n-1;i=0;i–)

{

temp=argu[i][n];

for(j=n-1;ji;j–)

{

temp-=argu[i][j]*root[j];

}

root[i]=temp/argu[i][i];

}

}

void get_y(float trans_A[][N],float x_y[][2],float y[],int n)

{

int i,j;

float temp;

for(i=0;in;i++)

{

temp=0;

for(j=0;jN;j++)

{

temp+=trans_A[i][j]*x_y[j][1];

}

y[i]=temp;

}

}

void cons_formula(float coef_A[][T+1],float y[],float coef_form[][T+2])

{

int i,j;

for(i=0;iT+1;i++)

{

for(j=0;jT+2;j++)

{

if(j==T+1)

coef_form[i][j]=y[i];

else

coef_form[i][j]=coef_A[i][j];

}

}

}

void print_root(float a[],int n)

{

int i,j;

printf(“%d个点的%d次拟合的多项式系数为:\n”,N,T);

for(i=0;in;i++)

{

printf(“a[%d]=%g,”,i+1,a[i]);

}

printf(“\n”);

printf(“拟合曲线方程为:\ny(x)=%g”,a[0]);

for(i=1;in;i++)

{

printf(” + %g”,a[i]);

for(j=0;ji;j++)

{

printf(“*X”);

}

}

printf(“\n”);

}

void process()

{

float x_y[N][2],matrix_A[N][T+1],trans_A[T+1][N],coef_A[T+1][T+1],coef_formu[T+1][T+2],y[T+1],a[T+1];

init(x_y,N);

get_A(matrix_A,x_y,N);

printf(“矩阵A为:\n”);

print_array(matrix_A,N);

matrix_trans(matrix_A,trans_A);

mutiple(trans_A,matrix_A,coef_A);

printf(“法矩阵为:\n”);

print_array(coef_A,T+1);

get_y(trans_A,x_y,y,T+1);

cons_formula(coef_A,y,coef_formu);

convert(coef_formu,T+1);

compute(coef_formu,T+1,a);

print_root(a,T+1);

}

void main()

{

process();

}

]]

/Content

PostDateTime2007-4-19 19:23:57/PostDateTime

/Reply

Reply

PostUserNickName/PostUserNickName

rank一级(初级)/rank

ranknumuser1/ranknum

credit100/credit

ReplyID40389872/ReplyID

TopicID5478010/TopicID

PostUserId1526752/PostUserId

PostUserNamejiangxc2004/PostUserName

Point0/Point

Content

![CDATA[

你可以改一下

不从终端输入,直接在程序中给出参数

请输入5个已知点:

(x0 y0):-2 -0.1

(x1 y1):-1 0.1

(x2 y2):0 0.4

(x3 y3):1 0.9

(x4 y4):2 1.6

矩阵A为:

1 -2 4 -8

1 -1 1 -1

1 0 0 0

1 1 1 1

1 2 4 8

法矩阵为:

5 0 10 0

0 10 0 34

10 0 34 0

0 34 0 130

5个点的3次拟合的多项式系数为:

a[1]=0.408571, a[2]=0.391667, a[3]=0.0857143, a[4]=0.00833333,

拟合曲线方程为:

y(x)=0.408571 + 0.391667*X + 0.0857143*X*X + 0.00833333*X*X*X

]]

/Content

PostDateTime2007-4-19 19:26:11/PostDateTime

/Reply

Reply

PostUserNickName/PostUserNickName

rank一级(初级)/rank

ranknumuser1/ranknum

credit100/credit

ReplyID40390406/ReplyID

TopicID5478010/TopicID

PostUserId1526752/PostUserId

PostUserNamejiangxc2004/PostUserName

Point0/Point

Content

![CDATA[

这样就可以直接调用process()函数了!

二次拟合的话就把宏 T 成2;

拟合点的数目 N 也可以修改!

也可以去到注释的部分进行返回值的调用!

c语言最小二乘法 求助

这个平面上随机点产生我直接用的一维产生方法,不知道你要求的是什么样的分布

#includetime.h

#includestdio.h

#includestdlib.h

////////////////设置区间///////////////////

#define MAX_X (10000)

#define MIN_X (-10000)

#define MAX_Y (10000)

#define MIN_Y (-10000)

#define NODE_NUM (10) //随机点个数

int main()

{

////////////////////生成随机点/////////////////

srand((unsigned int)time(NULL));//设置随机种子

int i;

float interval_x,interval_y;

interval_x = MAX_X-MIN_X;

interval_y = MAX_Y-MIN_Y;

float rand_x[NODE_NUM],rand_y[NODE_NUM];

for(i=0;iNODE_NUM;i++)

{

rand_x [i] = (rand()/(float)RAND_MAX)*interval_x+MIN_X;

rand_y [i] = (rand()/(float)RAND_MAX)*interval_y+MIN_Y;

printf(“rand_x[%d] = %f, rand_y[%d] = %f\n”,i,rand_x[i],i,rand_y[i]);

}

////////////////////最小二乘法/////////////////

//mean_x,mean_y均值,

//y=ax+b

//sum_xy为x[i]*y[i]的和

//sum_xx为x平方的和

//wiki 最小二乘法给出了两个公式,结果相同 ,选一个就行了

double mean_x,mean_y,a,b,sum_xy,sum_xx;

mean_x = 0;

mean_y = 0;

sum_xx = 0;

sum_xy = 0;

//////////////公式一////////////

for(i=0;iNODE_NUM;i++)

{

mean_x += rand_x[i];

mean_y += rand_y[i];

sum_xy += rand_x[i]*rand_y[i];

sum_xx += rand_x[i]*rand_x[i];

}

mean_x = mean_x/NODE_NUM;

mean_y = mean_y/NODE_NUM;

a = (sum_xy-NODE_NUM*mean_x*mean_y)/(sum_xx-NODE_NUM*mean_x*mean_x);

b = mean_y-a*mean_x;

//////////////公式二////////////

float fenzi,fenmu,a1,b1;

fenzi = 0;

fenmu = 0;

for(i=0;iNODE_NUM;i++)

{

fenzi += (rand_x[i]-mean_x)*(rand_y[i]-mean_y);

fenmu += (rand_x[i]-mean_x)*(rand_x[i]-mean_x);

}

a1 = fenzi/fenmu;

b1 = mean_y-a1*mean_x;

printf(“方法一:y = (%f)*x+(%f)\n”,a,b);

printf(“方法二:y = (%f)*x+(%f)\n”,a1,b1);

return 0;

}

关于c语言实现最小二乘法和最小二乘法函数的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月4日 14:28:33
下一篇 2024年4月4日 14:36:44

相关推荐

  • excel求值函数,excel函数公式大全

    Excel中2010版进行使用常见函数进行数学计算的操作技巧 1、打开一个Excel表格。输入要乘的数据。在其他位置输入一个固定的数字,以0.8为例,选择复制。选择这列要输入的数据后选择,粘贴。选择选择性粘贴。在弹出的窗体中选择运算中的乘,点击确定。 2、Excel2010中进行函数求平均值的操作步骤如下:打开excel2010,创建如下测试数据内容,在平均…

    2024年5月18日
    4300
  • c语言的静态函数,c语言 静态函数

    C语言中static修饰的函数和普通函数的区别 1、static是静态函数,可以是全局函数,而普通函数是局部函数。全局函数可以在其它模块中引用调用。作用域比普通函数大。全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 2、你好,static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝…

    2024年5月18日
    5400
  • 相对平均偏差用excel算,相对平均偏差用ex函数来算

    excel如何计算相对平均偏差 相对平均偏差值需要用到的是AVEDEV函数,在excel调用这个函数就可以计算相对平均偏差。具体操作如下:Excel中返回一组数据与其平均值的绝对偏差的平均值需要用到AVEDEV函数。 相对标准偏差RSD,又称变异系数。RSD=(s/(x平均))*100%。可以用Excel表中函数功能“=STDEV()”计算,括号内填入需要求…

    2024年5月18日
    4800
  • excel样本标准差,excel样本标准差函数

    excel样本标准差怎么算(统计学样本标准差怎么算) 首先在excel表格中输入一组销售数据。如果需要计算样本标准差,直接输入:=STDEV(A2:A9)。点击回车即可得到计算样本标准差的结果。如果需要计算整体标准差,可以输入公式:=STDEVP(A2:A9)。 在电脑上打开需要计算标准差的excel数据文件,进入编辑菜单界面。选择标准差要出现的单元格,然后…

    2024年5月18日
    3800
  • excel判断日期函数,excel公式判断日期是否到期

    请问如何利用excel函数判断日期? 用if函数吧。这样做:假定你A列存放的是你的日期,如下:A1 2007-1-1 A2 2006-10-1 A3 2007-1-10 ……你可以在B1输入200-1-1 ,然后在C1输入 =if($B$1-A1=0,已到期,未到期) 回车后就有结果了。 可以使用Excel中的函数来判断日期是否在指定范围内。以下是一种可能的…

    2024年5月18日
    3900
  • javascript函数是否存在,js函数里面嵌套函数

    js如何查找数组中是否存在某个值 可以使用Array.prototype.find()方法来查找数组中是否存在某个符合条件的对象。 方法一: arr.length js判断数组是否含有某个值 方法一: arr.indexOf()方法二: for循环结合if判断 方法三: arr.find(callback)方法四: arr.includes() 数组中含有某…

    2024年5月18日
    2900
  • c语言分配内存函数,c程序内存分配

    C语言中的动态内存分配的用法举例 1、上例中动态分配了10个整型存储区域,然后进行赋值并打印。 2、调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。 3、在C语言中使用malloc函数进…

    2024年5月18日
    4000
  • c语言ctype.h,c语言ctype函数

    C语言判断字符串是不是都是字母 1、isalnum() 用来判断一个字符是否为英文字母或数字,相当于 isalpha(c) || isdigit(c),其原型为:int isalnum(int c);【参数】c 为需要检测的字符。 2、根据ascii码值判断即可。由于数字,大小写字母均分别为连续存储,所以只需要与对应的最大最小值比较即可确定字符类型。代码如下…

    2024年5月18日
    4700
  • 单片机c语言延时计算,单片机c语言延时函数延时时间咋算

    单片机延时1秒如何计算要最详细一点的要过程用C语言 C语言的语句,就要更多。在编写延时函数之前,首先确认一下系统对晶振的分频系数,从而确定每个单周期指令执行所需的时间,一般的单片机都将指令执行周期设置为1us,这样就可以写一个比较接近1秒的延时函数了。 k不一样延时也不一样。而这种靠执行指令延时的程序的延时里昂: 可以通过查看她的反汇编代码来分析得到。 也可…

    2024年5月18日
    3600
  • 用excel怎么做函数图像,excel怎么做函数图像斜率

    怎么用excel制作复杂的函数图像 1、首先,在桌面上新建一个EXCEL表格,并双击打开。然后,在表格中输入要输入的内容。然后在其中一个单元格输入公式=(D4-D3)/D3,然后回车确认。然后将公式通过下拉方式,应用到这一整列。 2、在功能区中选择“插入”选项卡,在“图表”组中依次单击“散点图→带平滑线的散点图”。Excel将插入如下图所示的图表区,并在功能…

    2024年5月18日
    3500

发表回复

登录后才能评论



关注微信