最小二乘法常用于根據(jù)實(shí)測數(shù)據(jù)求線性方程的最近似解。根據(jù)如圖(圖片引用于百度百科)的描述,利用C語言求,使用最小二乘法算法求線性方程的解,程序如下:
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供汝南網(wǎng)站建設(shè)、汝南做網(wǎng)站、汝南網(wǎng)站設(shè)計(jì)、汝南網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、汝南企業(yè)網(wǎng)站模板建站服務(wù),十載汝南做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
#include?stdio.h
#define?N?4??//共有4個(gè)記錄,根據(jù)需要增加記錄
typedef?struct?Data{?//定義實(shí)驗(yàn)記錄結(jié)構(gòu)?
int?w;?//實(shí)驗(yàn)次數(shù)?
double?x;??
double?y;
}DATA;
//根據(jù)d中的n個(gè)DATA記錄,計(jì)算出線性方程的a,b兩值
void?getcs(DATA?*d,int?n,double?a,double?b){
double?fi11=0,fi12=0,fi21=0,fi22=0,f1=0,f2=0;
int?i;
for(i=0;in;i++){
fi11+=d[i].w;
fi12+=d[i].w*d[i].x;
fi21=fi12;
fi22+=d[i].w*d[i].x*d[i].x;
f1+=d[i].w*d[i].y;
f2+=d[i].w*d[i].x*d[i].y;
}
//解一元一次方程
b=(f2*fi11/fi21-f1)/(fi22*fi11/fi21-fi12);
a=(f2*fi12/fi22-f1)/(fi21*fi12/fi22-fi11);
}
int?main(){
DATA?d[N]={??//定義時(shí)賦初值,共4個(gè)記錄
{2,0.1,1.1},
{1,0.2,1.9},
{1,0.3,3.1},
{1,0.4,3.9}
};
double?a,b;
getcs(d,N,a,b);??//計(jì)算線性方程參數(shù)a,b
printf("線性方程是:Y=%.4lf+%.4lfX\n",a,b);
}
#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("請你輸入需要測試的數(shù)據(jù)(先輸入x[],后輸入y[])的個(gè)數(shù):");
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("---------------請你輸入的要擬合的函數(shù)------------------\n");
printf(" 1、擬合一次函數(shù)\n");
printf(" 2、擬合二次函數(shù)\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("函數(shù)為: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("函數(shù)為:p(x) = %.4f + (%.4f)*x + (%.4f)*x*x\n",a[0][n],a[1][n],a[2][n]);
getchar();}
#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 ("請輸入你想計(jì)算的x,y的個(gè)數(shù):");
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"輸入有誤!);
}
網(wǎng)站名稱:最小二乘sin函數(shù)C語言 最小二乘法 c#
網(wǎng)站網(wǎng)址:http://www.muchs.cn/article28/doeopjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、全網(wǎng)營銷推廣、靜態(tài)網(wǎng)站、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)