
正文
c语言中如何求拟合函数 c语言曲线拟合多项式
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
想用C语言编写多项式拟合的程序
#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];
}
}
相关问答
Q1: C语言线性曲线拟合
可以直接在线进行拟合,下面是地址(已验证)
建议你直接对数据用Matlab的cftool拟合(可以自由的自定义拟合函数形式)
Q2: c语言怎么把数据拟合成函数并画线
1、通过一些点拟合出一条直线。
2、参数:pt_input指向传入的点的指针。
3、ptNumbers传入的点数量。
4、k指向拟合直线参数k的指针。
5、b指向拟合直线参数b的指针。
Q3: 用C语言或C++编写线性方程拟合 y=a+bx
#include iostream
using namespace std;
const int MAXNUM = 3;
int main()
{
double x[MAXNUM],y[MAXNUM];
double sumx=0,sumy=0,sumxy=0,sumxx=0;
double a,b;
int i;
cout"输入"MAXNUM"组样本:";
for (i=0;iMAXNUM;i++)
{
cinx[i]y[i];
sumx += x[i];
sumy += y[i];
sumxy = x[i]*y[i];
sumxx = x[i]*x[i];
}
double averagex,averagey;
averagex = sumx/MAXNUM;
averagey = sumy/MAXNUM;
b = (sumxy - MAXNUM*averagex*averagey)/(sumxx - MAXNUM*averagex*averagex);
a = averagey - b*averagex;
cout"线性拟合曲线为:y="a"+"b"*y\n";
return 0;
}
Q4: 急求!!!如何用c语言实现多元线性拟合
Dim a() As String, b() As String
Private Sub Command1_Click()
Dim temp1 As String
Dim i As Integer, k As Integer
temp1 = Text1.Text
a = Split(temp1, ",")
lenolds = Len("-")
For i = 0 To UBound(a)
s = a(i)
j = InStr(s, "-")
Do While j 0
ReDim Preserve b(i, k)
b(i, k) = Val(Left(s, j + lenolds))
s = Left(s, j - 1) + "-" + Mid(s, j + lenolds + 1)
k = k + 1
j = InStr(s, "-")
Loop
ReDim Preserve b(i, k)
b(i, k) = s
Next i
For i = 0 To UBound(a)
For j = 0 To k
Text2.Text = Text2.Text + b(i, j)
Next j
Next i
End Sub
Q5: 如何用c语言编写32阶多项式拟合函数?
这与几阶多项式无关,关键是用什么方法拟合。如果只有33个数据点,解一族线性方程就可以了,如果有很多组数据,就用最小而乘法,步骤略微多一些。看看计算方法的书就任意操作了。
关于c语言中如何求拟合函数和c语言曲线拟合多项式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







