在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...