ehsan_faal
سه شنبه 30 تیر 1394, 14:41 عصر
سلام.
من باید ریشه های یک چند جمله ای رو توی زبان C++ بدست بیارم. میخوام که الگوریتمی که توی تابع roots متلب استفاده میشه رو استفاده کنم.
تا جایی که تحقیق کردم متلب مقادیر ویژه ماتریش Comapnion رو حساب میکنه. من هم همون الگوریتم رو برای ++C نوشتم منتها ریشه ها خیلی با جوابهای متلب فاصله داره، کسی میدونه ایراد کارم کجاست؟
vector<complex<double>> roots(
const std::vector<double> &coeffs)
{
int matsz = coeffs.size() - 1;
vector<complex<double>> vret;
vector<double> C(coeffs.size());
transform(coeffs.rbegin(),coeffs.rend(),C.begin(),[](auto& item){
return item;
});
MatrixXd companion_mat=MatrixXd::Zero(matsz,matsz);
for(int n = 0; n < matsz; n++){
for(int m = 0; m < matsz; m++){
if(n == m + 1)
companion_mat(n,m) = 1.0;
if(m == matsz-1)
companion_mat(n,m) =
-C[n] / C.back();
}
}
MatrixXcd eig = companion_mat.eigenvalues();
for(int i = 0; i < matsz; i++)
vret.push_back( eig(i) );
return vret;
}
جوابهای ++C:
Root Finding Section:
Interested Polynomial Coefficients:
4.16257 , 0 , -11.1309 , 0 , 10.9619 , 0 , -4.98668 , 0 , 1.28174 , 0
(0.939933,0.13167)
(0.939933,-0.13167)
(-0.939931,0.131673)
(-0.939931,-0.131673)
(-1.2409,0.678747)
(-1.2409,-0.678747)
(1.2409,0.678747)
(1.2409,-0.678747)
جوابهای متلب:
0.000000000000000 + 0.000000000000000i
-1.043428789214894 + 0.146171858075669i
-1.043428789214894 - 0.146171858075669i
-0.620284451427052 + 0.339282162499915i
-0.620284451427052 - 0.339282162499915i
1.043428789214895 + 0.146171858075669i
1.043428789214895 - 0.146171858075669i
0.620284451427052 + 0.339282162499915i
0.620284451427052 - 0.339282162499915i
(مطمئن نبودم که این تاپیک رو کجا باید ایجاد کنم ولی به نظرم چون میخوام راجع به الگوریتم استفاده شده توی متلب سوال کنم اینجا جای مناسبتریه)
با تشکر
من باید ریشه های یک چند جمله ای رو توی زبان C++ بدست بیارم. میخوام که الگوریتمی که توی تابع roots متلب استفاده میشه رو استفاده کنم.
تا جایی که تحقیق کردم متلب مقادیر ویژه ماتریش Comapnion رو حساب میکنه. من هم همون الگوریتم رو برای ++C نوشتم منتها ریشه ها خیلی با جوابهای متلب فاصله داره، کسی میدونه ایراد کارم کجاست؟
vector<complex<double>> roots(
const std::vector<double> &coeffs)
{
int matsz = coeffs.size() - 1;
vector<complex<double>> vret;
vector<double> C(coeffs.size());
transform(coeffs.rbegin(),coeffs.rend(),C.begin(),[](auto& item){
return item;
});
MatrixXd companion_mat=MatrixXd::Zero(matsz,matsz);
for(int n = 0; n < matsz; n++){
for(int m = 0; m < matsz; m++){
if(n == m + 1)
companion_mat(n,m) = 1.0;
if(m == matsz-1)
companion_mat(n,m) =
-C[n] / C.back();
}
}
MatrixXcd eig = companion_mat.eigenvalues();
for(int i = 0; i < matsz; i++)
vret.push_back( eig(i) );
return vret;
}
جوابهای ++C:
Root Finding Section:
Interested Polynomial Coefficients:
4.16257 , 0 , -11.1309 , 0 , 10.9619 , 0 , -4.98668 , 0 , 1.28174 , 0
(0.939933,0.13167)
(0.939933,-0.13167)
(-0.939931,0.131673)
(-0.939931,-0.131673)
(-1.2409,0.678747)
(-1.2409,-0.678747)
(1.2409,0.678747)
(1.2409,-0.678747)
جوابهای متلب:
0.000000000000000 + 0.000000000000000i
-1.043428789214894 + 0.146171858075669i
-1.043428789214894 - 0.146171858075669i
-0.620284451427052 + 0.339282162499915i
-0.620284451427052 - 0.339282162499915i
1.043428789214895 + 0.146171858075669i
1.043428789214895 - 0.146171858075669i
0.620284451427052 + 0.339282162499915i
0.620284451427052 - 0.339282162499915i
(مطمئن نبودم که این تاپیک رو کجا باید ایجاد کنم ولی به نظرم چون میخوام راجع به الگوریتم استفاده شده توی متلب سوال کنم اینجا جای مناسبتریه)
با تشکر