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

来源:百度知道 编辑:UC知道 时间:2024/05/21 23:50:40
各位高手,谁知道怎么把这两个相互对应的数组的曲线给我拟合出来。
用C/C++都可以!很急知道帮忙一下~~~小妹感激不尽。
double X[21] = {0.00,0.056,0.112,0.168,0.224,0.280,0.336,0.392,0.448,0.504,0.560, 0.616,0.672,0.728,0.784,0.84,0.896,0.952,0.1008,0.1064,1.12}
double Y[21] = {0.00,1.66,3.31,4.96,6.6,8.22,9.82,11.4,12.94,14.43,15.86,17.22,18.5, 19.69,20.79,21.79,22.71,23.53,24.25,24.87,25.4};谢谢拉~~

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

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

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

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

解决:
#include <iostream.h>

void main()
{
double X[21] = {0.00,0.056,0.112,0.168,0.224,0.280,0.336,0.392,0.448,0.504,0.560, 0.616,0.672,0.728,0.784,0.84,0.896,0.952,0.1008,0.1064,1.12} ;
double Y[21] = {0.00,1.66,3.31,4.96,6.6,8.22,9.82,11.4,12.94,14.43,15.86,17.22,18.5, 19.69,20.79,21.79,22.71,23.53,24.25,24.87,25.4};
double midx;
double midy;
midx=0;
midy=0;
///求平均值
for(int i=0;i<21;++i)
{
midx+=(X[i]/21.0);
midy+=(Y[i]/21.0);
}
///求斜率
double lineK;
lineK=0;
double tempMu;
double tempZi;
tempMu=0;
tempZi=0;
for(int v=0;v<21;++v)
{
tempMu+=((X[v]-midx)*(X[v]-midx));
tempZi+=((X[v]-midx)*(Y[v]-midy));