虽然我知道什么是曲线拟合,怎么做,但是我不清楚你问题的具体内容,
创新互联是一家专注于网站设计制作、网站制作与策划设计,市北网站建设哪家好?创新互联做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:市北等地区。市北做网站价格咨询:028-86922220
从chuaike24的回答
“请高手 说实话 我是菜鸟 但你的程序感觉好凌乱 好多地方可以精简说最明显的问题 power函数返回值无论怎样都返回0 ”来看,我可能是没看到你的程序,所以信息不全。
我只回答什么是曲线拟合
曲线拟合,简单来说,是指以近似的方法用一条曲线逼近一组数据点。
逼近的方法最常用的事最小二乘法,当然也有其他方法。
逼近的曲线可以是直线,也可以是多项式曲线,二次,三次,多次,也可以是分段多项式曲线,也可以是B样条曲线。在这里,如果不需要深入研究,你只要把B样条曲线理解为一种近似于分段多项式曲线即可。
你问的不多,这些对你的回答已经足够,需要深入了解再问
很简单 问题已经转化成 从文件读数据 数据类型转化 赋值到数组 这三步
#include "stdio.h"
#include stdlib.h
main()
{
int x[3] = {0}; //默认文件存了三个数据
FILE *fp1;//定义文件流指针,用于打开读取的文件
char text[1024];//定义一个字符串数组,用于存储读取的字符
fp1 = fopen("d:\\forecast1.txt","r");//只读方式打开文件a.txt
int i=0;
while(fgets(text,1024,fp1)!=NULL)//逐行读取fp1所指向文件中的内容到text中
{
int tmp = atoi(text);//输出到屏幕
x[i++] = tmp;
}
fclose(fp1);//关闭文件a.txt,有打开就要有关闭
}
y[i] 同理
m阶多项式拟合,是算法问题,不是计算机语言问题。你先要有你的具体计算策略和方法,数值计算时,用计算机语言写出程序,算出结果。用 c 语言 或 fortran 语言 或别的语言,大同小异,没有原则差别。
你先要定出你的方程形式,例如
y = a1*x^m+a2*x^(m-1)+...am
a1,a2,...,am 是 m 个待定系数
把你的离散点[xi,yi] 代入方程,你可以得到 线性方程式 yi = a1*xi^m+a2*xi^(m-1)+...am
若你有 n 个点,就得到 n 个 方程式。若 nm 有无穷解,若 n=m 有一解。
通常 离散点的个数 远超过 方程阶数,也就是方程个数超出要解的未知数的个数,nm,这时,
通常 用 最小二乘法 求解 这个线性方程组。也就是所谓的拟合。
最小二乘法 求解 这个线性方程组 的程序 网上(这里不敢写,写了,你就看不到我的贴子了)可以找到,自己写也不复杂。
曲线拟合文章估计百度文库里也有。
#includestdio.h
#includemath.h
void Guass(int n,float Array[][10])
{
float s,u;
int i,j,k,a,x,y;
for(i=0;in-1;i++)
{
s=Array[i][i];
k=i;
for(a=i+1;an;a++)
{
if(fabs(s) fabs(Array[a][i]))
{
s=Array[a][i];
k=a;
}
}
if(k!=i)
{
for(j=i;jn+1;j++)
{
u=Array[i][j];Array[i][j]=Array[k][j];Array[k][j]=u;
}
}
for(x=i+1;xn;x++)
{
u=Array[x][i]/s;
for(y=i;yn+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;yn;y++)
s=s+Array[x][y]*Array[y][n];
Array[x][n]=(Array[x][n]-s)/(Array[x][x]);//得到结果
}
for(i=0;in;i++)printf("%f ",Array[i][n]);printf("\n");
}
int main()
{
int n,i,j;
float Array[10][10];
scanf("%d",n);
for(i=0;in;i++)
{
for(j=0;jn+1;j++)
scanf("%f",Array[i][j]);
}
Guass(n,Array);
return 0;
}
你的串号我已经记下,采纳后我会帮你制作