功能: 旋转平移多项式拟合

格式: 
[f,R,t] = PolyRFit(x,y,n,opt)

x  : 矩阵变量,存储x方向值
y  : 矩阵变量,存储y方向值
n  : 多项式最高次数
opt: 数值,为0时开启局部优化,非0时打开启发式优化,默认为1

f : 返回的最佳多项式
R : 返回2*2变换矩阵
t : 返回2*1平移矩阵

说明:
1. 有些曲线在当前坐标系下无法使用一个多项式表示,但是通过坐标系的改变,其可以使用多项式表示
2. 本函数就尝试在一个最佳变换坐标系下,找到一个最佳拟合多项式
3. 原理
$$
\begin{cases}
\mathbf{p} &=\begin{bmatrix}x
\\
y
\end{bmatrix}
\\
\\
\begin{bmatrix}
x'
\\
y'
\end{bmatrix}&=R\mathbf{p}+\mathbf{t}
\\
\\
y'&=a_0+\sum_{k=1}^n a_kx'^k=f(x')
\end{cases}
$$

4. 由于平移或者对称旋转,同一个形态可以有无数组解,往往这种我们只关注形态,因此本函数只返回其中一组解以保证曲线形态唯一

例子:
//1. 这里我们先创建一组多项式数据
x = 0:0.01:10;
y = 4*(x-5)*(x-2)*(x-6.8);
R = {CreateRoate<矩阵运算/CreateRoate>}(1.23);
t = [0.2;0.3];
xy = [x;y];
xy = xy';
src = {TransRowPt<矩阵运算/TransRowPt>}(xy, R, t);
x1 = src(,1);
y1 = src(,2);

//2.上面的src就是在非当前坐标系下的曲线,它本质上在某个坐标系下的3次多项式
//现在已知曲线src,想找到一个变换,使得满足3次多项式
[f,R1,t1] = PolyRFit(x1, y1, 3)//执行得到如下结果
f =
{0.058817628165181552735+4.0000000000001003642*x^3-21.600000000001333689*x-4.7999999999993194777*x^2 }
r1 =
[-0.33423772712450   -0.94248880193169
  0.94248880193169   -0.33423772712450 ]
t1 =
[ 5.34959418600434
 -0.02940881408259 ]

//3.这里可以按如下方式验证
//3.1先确定需要拟合多项式曲线范围
dst  = {TransRowPt<矩阵运算/TransRowPt>}(src, r1, t1);//将原点变换到纠正坐标系
px   = dst(,1);//取出所有x
minx = min(px);
maxx = max(px);
x2   = {LineSpace<矩阵运算/LineSpace>}(minx, maxx, 1000);//在[minx,maxx]范围内采样1000个点
x2   = x2';
y2   = f(x2);

//3.2 将曲线拟合的点(x2, y2)变换回src对应坐标系
rt = r1';
t2 = {Mul<矩阵运算/Mul>}(rt, t1);
t2 = -t2;
xy2 =[x2,y2];
xy3 = {TransRowPt<矩阵运算/TransRowPt>}(xy2, rt, t2);
x3  = xy3(,1);
y3  = xy3(,2);

//4.可以画图对比
{Plot<矩阵运算/Plot>}(x1, y1, x3, y3);
