在matlab中查找定义为函数句柄的多项式的根
Finding the roots of a polynomial defined as a function handle in matlab
我需要能够找到几个多项式的根,这些多项式几乎是特征函数,但不完全是(与其说是特征值,不如说是特征块矩阵)。该函数被定义为函数句柄,因为我没有方程中系数的解析表达式(我大概可以找到它们,但我模型中的代数已经很乱了)。
等式是
charA = @(k1,k2) det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Amatrix - eye(2*N));
charB = @(k1,k2) det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Bmatrix - eye(2*N));
我需要找到每个根的所有根,因为系统的解是满足 charA(k1,k2)=0 和 charB(k1,k2)= 的对 (k1,k2) 0(目前我只是相信这些矩阵的推导是这样的解决方案存在,但为了这个问题的目的 - 找到以这种方式定义的多项式的所有根 - 这并不重要).
有什么方法可以将这个函数句柄转换成系数矩阵,或者是否有一个求解多项式的求解器,用于在 Matlab 中定义为函数句柄?如果它改变了什么,矩阵不是很大,但它们是 84x84,即 N=42。
如前所述 Daniel
- 使用符号数学工具箱构建多项式
- 然后用
solve()
求根
示例代码如下带N = 2
rng(0)
%Unknowns
syms k1 k2
N = 2;
Amatrix = rand(2*N);
Bmatrix = rand(2*N);
charA = det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Amatrix - eye(2*N));
charB = det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Bmatrix - eye(2*N));
% solver
solution = solve(charA == 0, charB == 0);
% Convert syms to numeric, specifying precision as 3
k1_solution = vpa(solution.k1, 3)
k2_solution = vpa(solution.k2, 3)
% Only real solution
k1_solution_real = vpa(k1_solution(k1_solution == real(k1_solution)), 3)
k2_solution_real = vpa(k2_solution(k2_solution == real(k2_solution)), 3)
解决方案
- 全部
k1_solution =
0.475
-2.52
0.0161
- 1.58 + 1.79i
- 1.6 - 1.79i
- 2.0 - 0.863i
- 2.0 + 0.865i
11.2
k2_solution =
0.345
-0.869
0.946
- 1.37 + 0.0219i
- 1.37 - 0.0219i
1.69 + 3.24i
1.69 - 3.24i
-5.65
- 仅真实
k1_solution_real =
0.475
-2.52
0.0161
11.2
k2_solution_real =
0.345
-0.869
0.946
-5.65
- 第一个根解
k1 = 0.475 and k2 = 0.345
我需要能够找到几个多项式的根,这些多项式几乎是特征函数,但不完全是(与其说是特征值,不如说是特征块矩阵)。该函数被定义为函数句柄,因为我没有方程中系数的解析表达式(我大概可以找到它们,但我模型中的代数已经很乱了)。
等式是
charA = @(k1,k2) det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Amatrix - eye(2*N));
charB = @(k1,k2) det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Bmatrix - eye(2*N));
我需要找到每个根的所有根,因为系统的解是满足 charA(k1,k2)=0 和 charB(k1,k2)= 的对 (k1,k2) 0(目前我只是相信这些矩阵的推导是这样的解决方案存在,但为了这个问题的目的 - 找到以这种方式定义的多项式的所有根 - 这并不重要).
有什么方法可以将这个函数句柄转换成系数矩阵,或者是否有一个求解多项式的求解器,用于在 Matlab 中定义为函数句柄?如果它改变了什么,矩阵不是很大,但它们是 84x84,即 N=42。
如前所述 Daniel
- 使用符号数学工具箱构建多项式
- 然后用
solve()
求根
示例代码如下带N = 2
rng(0)
%Unknowns
syms k1 k2
N = 2;
Amatrix = rand(2*N);
Bmatrix = rand(2*N);
charA = det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Amatrix - eye(2*N));
charB = det([k1*eye(N),zeros(N);zeros(N),k2*eye(N)]*Bmatrix - eye(2*N));
% solver
solution = solve(charA == 0, charB == 0);
% Convert syms to numeric, specifying precision as 3
k1_solution = vpa(solution.k1, 3)
k2_solution = vpa(solution.k2, 3)
% Only real solution
k1_solution_real = vpa(k1_solution(k1_solution == real(k1_solution)), 3)
k2_solution_real = vpa(k2_solution(k2_solution == real(k2_solution)), 3)
解决方案
- 全部
k1_solution =
0.475
-2.52
0.0161
- 1.58 + 1.79i
- 1.6 - 1.79i
- 2.0 - 0.863i
- 2.0 + 0.865i
11.2
k2_solution =
0.345
-0.869
0.946
- 1.37 + 0.0219i
- 1.37 - 0.0219i
1.69 + 3.24i
1.69 - 3.24i
-5.65
- 仅真实
k1_solution_real =
0.475
-2.52
0.0161
11.2
k2_solution_real =
0.345
-0.869
0.946
-5.65
- 第一个根解
k1 = 0.475 and k2 = 0.345