c 多項式擬合polyfit實現

2021-10-08 08:41:47 字數 2876 閱讀 1422

在numpy中有很方便的多項式擬合函式,c++中則沒有,需要自己實現。

在網上參考了一些,但是都不能令人滿意,其中有借用opencv的,我就做乙個曲線擬合,引入龐大的opencv有點小題大做了。

也有使用eigen庫的,這個還差強人意,先記錄下來。

double polyeval(eigen::vectorxd coeffs, double x) 

return result;

}eigen::vectorxd polyfit(eigen::vectorxd xvals, eigen::vectorxd yvals, int order)

for (int j = 0; j < xvals.size(); j++)

} auto q = a.householderqr();

auto result = q.solve(yvals);

return result;

}eigen::vectorxd xvals(6);

eigen::vectorxd yvals(6);

xvals << 9.261977, -2.06803, -19.6663, -36.868, -51.6263, -66.3482;

yvals << 5.17, -2.25, -15.306, -29.46, -42.85, -57.6116;

auto coeffs= polyfit(xvals,yvals,3);

std::cout<< "y(16)=" << polyeval(coeffs,16) << endl;

這個也可以參考:

#include #include #include using namespace std;

//最小二乘擬合相關函式定義

double sum(vectorvnum, int n);

double mutilsum(vectorvx, vectorvy, int n);

double relatepow(vectorvx, int n, int ex);

double relatemutixy(vectorvx, vectorvy, int n, int ex);

void ematrix(vectorvx, vectorvy, int n, int ex, double coefficient);

void calequation(int exp, double coefficient);

double f(double c,int l,int m);

double em[6][4];

//主函式,這裡將資料擬合成二次曲線

int main(int argc, char* ar**)

; double arry2[5]=;

double coefficient[5];

memset(coefficient,0,sizeof(double)*5);

vectorvx,vy;

for (int i=0; i<5; i++)

ematrix(vx,vy,5,3,coefficient);

printf("擬合方程為:y = %lf + %lfx + %lfx^2 \n",coefficient[1],coefficient[2],coefficient[3]);

return 0;

}//累加

double sum(vectorvnum, int n)

em[i][ex+1]=relatemutixy(vx,vy,n,i-1);

}em[1][1]=n;

calequation(ex,coefficient);

}//求解方程

void calequation(int exp, double coefficient)

//供calequation函式呼叫

double f(double c,int l,int m)

我心中的多項式擬合應該是基於模板類的通用多項式擬合函式。

下面是一段自己寫的測試程式:

#include #include double polyeval(eigen::vectorxd coeffs, double x) 

return result;

}eigen::vectorxd polyfit(eigen::vectorxd xvals, eigen::vectorxd yvals, int order)

for (int j = 0; j < xvals.size(); j++)

} auto q = a.householderqr();

auto result = q.solve(yvals);

return result;

}#include #include int main(int argc, char** ar**)

; eigen::vectorxf b = eigen::map(a.data(), a.size());

std::cout << "b:\n"<< b << std::endl;

eigen::vectorxd d = b.cast();

std::cout << "d:\n" << d << std::endl;

auto coeffs = polyfit(xvals, yvals, 1);

std::cout << coeffs << std::endl;

std::cout << "y(16)=" << polyeval(coeffs, 16) << std::endl;

return 0;

}

等有時間我自己寫乙個補充上。

參考:c++實現多項式曲線擬合--polyfit

參考:多項式擬合實現(c++)

C 實現多項式曲線擬合 polyfit

基本原理 冪函式可逼近任意函式。上式中,n表示多項式階數,實際應用中一般取3或5 假設n 5,則 共有6個未知數,僅需6個點即可求解 可表示為矩陣方程 y的維數為 r 1 u的維數 r 6 k的維數 6 1 r 6時,超定方程求解 下面是使用c 實現的多項式擬合的程式,程式中使用opencv進行矩陣...

polyfit多項式擬合函式的用法

polyfit函式是matlab中用於進行曲線擬合的乙個函式。其數學基礎是最小二乘法曲線擬合原理。曲線擬合 已知離散點上的資料集,即已知在點集上的函式值,構造乙個解析函式 其圖形為一曲線 使在原離散點上盡可能接近給定的值。polyfit x,y,n 其中 x,y為已知資料點向量,分別表示橫 縱座標,...

一元多項式的資料擬合 polyfit

x 源資料點對應的橫座標,可為行向量 矩陣 y 源資料點對應的縱座標,可為行向量 矩陣 n 要擬合的階數,k階擬合需要確定k 1個未知引數,故而至少需要k 1對點 x,y p 擬合多項式 的係數 共n 1個 s s是乙個結構體陣列 struct 用來估計 誤差,包含了r,df和normr。r pol...