大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、通过一些点拟合出一条直线。
专注于为中小企业提供成都做网站、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业永清免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
2、参数:pt_input指向传入的点的指针。
3、ptNumbers传入的点数量。
4、k指向拟合直线参数k的指针。
5、b指向拟合直线参数b的指针。
虽然我知道什么是曲线拟合,怎么做,但是我不清楚你问题的具体内容,
从chuaike24的回答
“请高手 说实话 我是菜鸟 但你的程序感觉好凌乱 好多地方可以精简说最明显的问题 power函数返回值无论怎样都返回0 ”来看,我可能是没看到你的程序,所以信息不全。
我只回答什么是曲线拟合
曲线拟合,简单来说,是指以近似的方法用一条曲线逼近一组数据点。
逼近的方法最常用的事最小二乘法,当然也有其他方法。
逼近的曲线可以是直线,也可以是多项式曲线,二次,三次,多次,也可以是分段多项式曲线,也可以是B样条曲线。在这里,如果不需要深入研究,你只要把B样条曲线理解为一种近似于分段多项式曲线即可。
你问的不多,这些对你的回答已经足够,需要深入了解再问
首先,谁都不能根据仅有的数据集来断定这就是什么曲线。
我们只能通过对数据观察推测可能会符合什么形式的曲线。
已知10个数据点的训练集,可以采用多项式拟合的办法来做,但是不建议使用C语言来实现。
这种数学问题用matlab很容易就可以解决,c语言写要麻烦的多的多。比如你采用最小二乘法的话,
你需要自己用c语言写很多矩阵运算。
曲线拟合的最小二乘法
如有实验数据如下
求x=55处的近似值 并画出图形
x 0 10 20 30 40 50 60 70 80 90
y 68 67.1 66.4 65.6 64.6 61.8 61.0 60.8 60.4 60
#include "stdio.h"
#include "graphics.h"
double s(double x[],double y[],double x1)
{
double a,b,tmp1=0,tmp2=0,tmp3=0,tmp4=0,result;
int i=0;
for(;i10;i++)
{
tmp1+=x[i]*x[i];
tmp2+=y[i];
tmp3+=x[i];
tmp4+=x[i]*y[i];
}
b=(tmp1*tmp2-tmp3*tmp4)/(10*tmp1-tmp3*tmp3);
a=(10*tmp4-tmp2*tmp3)/(10*tmp1-tmp3*tmp3);
result=a*x1+b;
return result;
}
void hzbz(int x,int y)
{
int i,j;
line(0,y,1024,y);
moveto(x-200,y);
j=x-200;
for(i=0;i100;i++)
{
if(i%5!=0)
lineto(j,y-5);
else
lineto(j,y-8);
j=j+10;
moveto(j,y);
}
line(x,768,x,0);
moveto(x,y+200);
j=y+640;
for(i=0;i300;i++)
{
if(i%5!=0)
lineto(x+5,j);
else
lineto(x+8,j);
j=j-10;
moveto(x,j);
}
line(x,0,x-8,6);
line(x,0,x+8,6);
line(640,y,634,y-8);
line(640,y,634,y+8);
}
void main()
{
double x[]={0,10,20,30,40,50,60,70,80,90};
double y[]={68,67.1,66.4,65.6,64.6,61.8,61.0,60.8,60.4,60};
int graphdriver=DETECT,graphmode;
int i;
printf("x=55\ny=%lf\n",s(x,y,55));
getch();
initgraph(graphdriver,graphmode, "");
setbkcolor(BLUE);
hzbz(200,200);
moveto(200,200);
for(i=0;i200;i++)
lineto(i+200,-s(x,y,i)+200);
getch();
closegraph();
}
很简单 问题已经转化成 从文件读数据 数据类型转化 赋值到数组 这三步
#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] 同理
可以直接在线进行拟合,下面是地址(已验证)
建议你直接对数据用Matlab的cftool拟合(可以自由的自定义拟合函数形式)