1、通過一些點(diǎn)擬合出一條直線。
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)永清免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
2、參數(shù):pt_input指向傳入的點(diǎn)的指針。
3、ptNumbers傳入的點(diǎn)數(shù)量。
4、k指向擬合直線參數(shù)k的指針。
5、b指向擬合直線參數(shù)b的指針。
雖然我知道什么是曲線擬合,怎么做,但是我不清楚你問題的具體內(nèi)容,
從chuaike24的回答
“請(qǐng)高手 說實(shí)話 我是菜鳥 但你的程序感覺好凌亂 好多地方可以精簡(jiǎn)說最明顯的問題 power函數(shù)返回值無論怎樣都返回0 ”來看,我可能是沒看到你的程序,所以信息不全。
我只回答什么是曲線擬合
曲線擬合,簡(jiǎn)單來說,是指以近似的方法用一條曲線逼近一組數(shù)據(jù)點(diǎn)。
逼近的方法最常用的事最小二乘法,當(dāng)然也有其他方法。
逼近的曲線可以是直線,也可以是多項(xiàng)式曲線,二次,三次,多次,也可以是分段多項(xiàng)式曲線,也可以是B樣條曲線。在這里,如果不需要深入研究,你只要把B樣條曲線理解為一種近似于分段多項(xiàng)式曲線即可。
你問的不多,這些對(duì)你的回答已經(jīng)足夠,需要深入了解再問
首先,誰都不能根據(jù)僅有的數(shù)據(jù)集來斷定這就是什么曲線。
我們只能通過對(duì)數(shù)據(jù)觀察推測(cè)可能會(huì)符合什么形式的曲線。
已知10個(gè)數(shù)據(jù)點(diǎn)的訓(xùn)練集,可以采用多項(xiàng)式擬合的辦法來做,但是不建議使用C語言來實(shí)現(xiàn)。
這種數(shù)學(xué)問題用matlab很容易就可以解決,c語言寫要麻煩的多的多。比如你采用最小二乘法的話,
你需要自己用c語言寫很多矩陣運(yùn)算。
曲線擬合的最小二乘法
如有實(shí)驗(yàn)數(shù)據(jù)如下
求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();
}
很簡(jiǎn)單 問題已經(jīng)轉(zhuǎn)化成 從文件讀數(shù)據(jù) 數(shù)據(jù)類型轉(zhuǎn)化 ?賦值到數(shù)組 ?這三步
#include?"stdio.h"
#include?stdlib.h
main()
{
int?x[3]?=?{0};?//默認(rèn)文件存了三個(gè)數(shù)據(jù)
FILE?*fp1;//定義文件流指針,用于打開讀取的文件
char?text[1024];//定義一個(gè)字符串?dāng)?shù)組,用于存儲(chǔ)讀取的字符
fp1?=?fopen("d:\\forecast1.txt","r");//只讀方式打開文件a.txt
int?i=0;
while(fgets(text,1024,fp1)!=NULL)//逐行讀取fp1所指向文件中的內(nèi)容到text中
{
int?tmp?=?atoi(text);//輸出到屏幕
x[i++]?=?tmp;
}
fclose(fp1);//關(guān)閉文件a.txt,有打開就要有關(guān)閉
}
y[i]?同理
可以直接在線進(jìn)行擬合,下面是地址(已驗(yàn)證)
建議你直接對(duì)數(shù)據(jù)用Matlab的cftool擬合(可以自由的自定義擬合函數(shù)形式)