我在哪里可以找到 Scilab balanc() 函数来计算相似性变换以在 Maxima 中对其进行编程
Where can I find the Scilab balanc() function to calculate the similarity transform to program it in Maxima
我正在尝试在 wxMaxima 中对 z 变换进行编程,它没有对其进行编程但不是根据定义而是通过使用 Scilab 方法。 Scilab 计算 z 变换首先将传递函数转换为状态 space,然后系统必须离散化,然后转换为 z 传递函数,我需要这个因为我需要做一些代数计算根据样本周期分析系统的稳定性。
现在我被函数 balanc() 困住了,它找到一个相似变换使得
Ab = X^(-1) . A . X
作为近似相等的行和列范数。
在不久的将来,我在 wxMaxima 中的大部分代码都是通过将 Scilab 代码翻译成 wxMaxima 来完成的,目前我正在编写 tf2ss() 函数,在该函数中调用了 balanc() 函数,问题是我在 Scilab 安装目录中找不到该函数的代码,我在书籍和论文中搜索了信息,但每个示例都以作为问题输入给出的 Ab 矩阵开头,Scilab 相反可以选择只有 A 矩阵作为输入,它计算 Ab 和 X 矩阵,所以,我需要帮助来使这个函数完全按照 Scilab 的编程来比较我正在做的所有步骤。
最后,wxMaxima 有一个计算相似性变换的函数,但它没有与 Scilab 相同的输出,这对我来说意味着他们使用不同的标准来计算相似性变换。
注意:我尝试在 wxMaxima 中进行计算,将 Ab 和 X 矩阵作为带变量的元素,但方程组仍然包含太多变量,无法求解。
在此先感谢您的帮助。
在 Scilab 中,balanc() 是硬编码的,并且基于 LAPACK 的 dgebal(参见 Fortran source at Netlib)。在算法中,操作非常简单(计算 inf 和 2-范数,交换矩阵的列或行),也许这很容易翻译?
可以在以下文档的第 3 页(算法 2)中找到该算法的更具可读性的版本:https://arxiv.org/abs/1401.5766。
这是算法 3 的 Scilab 实现:
function [A,X]=bal(Ain)
A = Ain;
n = size(A,1);
X = ones(n,1);
β = 2; // multiply or divide by radix preserves precision
p = 2; // eventually change to 1-norm
converged = 0;
while converged == 0
converged = 1;
for i=1:n
c = norm(A(:,i),p);
r = norm(A(i,:),p);
s = c^p+r^p;
f = 1;
while c < r/β
c = c*β;
r = r/β;
f = f*β;
end
while c >= r*β
c = c/β;
r = r*β;
f = f/β;
end
if (c^p+r^p) < 0.95*s
converged = 0;
X(i) = f*X(i);
A(:,i) = f*A(:,i);
A(i,:) = A(i,:)/f;
end
end
end
X = diag(X);
endfunction
在此示例中,上述实现给出了相同的平衡矩阵:
--> A=rand(5,5,"normal"); A(:,1)=A(:,1)*1024; A(2,:)=A(2,:)/1024
A =
897.30729 -1.6907865 -1.0217046 -0.9181476 -0.1464695
-0.5430253 -0.0011318 -0.0000356 -0.001277 -0.00038
-774.96457 3.1685332 0.1467254 -0.410953 -0.6165827
155.22118 0.1680727 -0.2262445 -0.3402948 1.6098294
1423.0797 -0.3302511 0.5909125 -1.2169245 -0.7546739
--> [Ab,X]=balanc(A)
Ab =
897.30729 -0.8453932 -32.694547 -14.690362 -9.3740507
-1.0860507 -0.0011318 -0.0022789 -0.0408643 -0.0486351
-24.217643 0.0495083 0.1467254 -0.2054765 -1.2331655
9.7013239 0.0052523 -0.452489 -0.3402948 6.4393174
22.23562 -0.0025801 0.2954562 -0.3042311 -0.7546739
X =
0.03125 0. 0. 0. 0.
0. 0.015625 0. 0. 0.
0. 0. 1. 0. 0.
0. 0. 0. 0.5 0.
0. 0. 0. 0. 2.
--> [Ab,X]=bal(A)
Ab =
897.30729 -0.8453932 -32.694547 -14.690362 -9.3740507
-1.0860507 -0.0011318 -0.0022789 -0.0408643 -0.0486351
-24.217643 0.0495083 0.1467254 -0.2054765 -1.2331655
9.7013239 0.0052523 -0.452489 -0.3402948 6.4393174
22.23562 -0.0025801 0.2954562 -0.3042311 -0.7546739
X =
1. 0. 0. 0. 0.
0. 0.5 0. 0. 0.
0. 0. 32. 0. 0.
0. 0. 0. 16. 0.
0. 0. 0. 0. 64.
我正在尝试在 wxMaxima 中对 z 变换进行编程,它没有对其进行编程但不是根据定义而是通过使用 Scilab 方法。 Scilab 计算 z 变换首先将传递函数转换为状态 space,然后系统必须离散化,然后转换为 z 传递函数,我需要这个因为我需要做一些代数计算根据样本周期分析系统的稳定性。
现在我被函数 balanc() 困住了,它找到一个相似变换使得
Ab = X^(-1) . A . X
作为近似相等的行和列范数。
在不久的将来,我在 wxMaxima 中的大部分代码都是通过将 Scilab 代码翻译成 wxMaxima 来完成的,目前我正在编写 tf2ss() 函数,在该函数中调用了 balanc() 函数,问题是我在 Scilab 安装目录中找不到该函数的代码,我在书籍和论文中搜索了信息,但每个示例都以作为问题输入给出的 Ab 矩阵开头,Scilab 相反可以选择只有 A 矩阵作为输入,它计算 Ab 和 X 矩阵,所以,我需要帮助来使这个函数完全按照 Scilab 的编程来比较我正在做的所有步骤。
最后,wxMaxima 有一个计算相似性变换的函数,但它没有与 Scilab 相同的输出,这对我来说意味着他们使用不同的标准来计算相似性变换。
注意:我尝试在 wxMaxima 中进行计算,将 Ab 和 X 矩阵作为带变量的元素,但方程组仍然包含太多变量,无法求解。
在此先感谢您的帮助。
在 Scilab 中,balanc() 是硬编码的,并且基于 LAPACK 的 dgebal(参见 Fortran source at Netlib)。在算法中,操作非常简单(计算 inf 和 2-范数,交换矩阵的列或行),也许这很容易翻译?
可以在以下文档的第 3 页(算法 2)中找到该算法的更具可读性的版本:https://arxiv.org/abs/1401.5766。
这是算法 3 的 Scilab 实现:
function [A,X]=bal(Ain)
A = Ain;
n = size(A,1);
X = ones(n,1);
β = 2; // multiply or divide by radix preserves precision
p = 2; // eventually change to 1-norm
converged = 0;
while converged == 0
converged = 1;
for i=1:n
c = norm(A(:,i),p);
r = norm(A(i,:),p);
s = c^p+r^p;
f = 1;
while c < r/β
c = c*β;
r = r/β;
f = f*β;
end
while c >= r*β
c = c/β;
r = r*β;
f = f/β;
end
if (c^p+r^p) < 0.95*s
converged = 0;
X(i) = f*X(i);
A(:,i) = f*A(:,i);
A(i,:) = A(i,:)/f;
end
end
end
X = diag(X);
endfunction
在此示例中,上述实现给出了相同的平衡矩阵:
--> A=rand(5,5,"normal"); A(:,1)=A(:,1)*1024; A(2,:)=A(2,:)/1024
A =
897.30729 -1.6907865 -1.0217046 -0.9181476 -0.1464695
-0.5430253 -0.0011318 -0.0000356 -0.001277 -0.00038
-774.96457 3.1685332 0.1467254 -0.410953 -0.6165827
155.22118 0.1680727 -0.2262445 -0.3402948 1.6098294
1423.0797 -0.3302511 0.5909125 -1.2169245 -0.7546739
--> [Ab,X]=balanc(A)
Ab =
897.30729 -0.8453932 -32.694547 -14.690362 -9.3740507
-1.0860507 -0.0011318 -0.0022789 -0.0408643 -0.0486351
-24.217643 0.0495083 0.1467254 -0.2054765 -1.2331655
9.7013239 0.0052523 -0.452489 -0.3402948 6.4393174
22.23562 -0.0025801 0.2954562 -0.3042311 -0.7546739
X =
0.03125 0. 0. 0. 0.
0. 0.015625 0. 0. 0.
0. 0. 1. 0. 0.
0. 0. 0. 0.5 0.
0. 0. 0. 0. 2.
--> [Ab,X]=bal(A)
Ab =
897.30729 -0.8453932 -32.694547 -14.690362 -9.3740507
-1.0860507 -0.0011318 -0.0022789 -0.0408643 -0.0486351
-24.217643 0.0495083 0.1467254 -0.2054765 -1.2331655
9.7013239 0.0052523 -0.452489 -0.3402948 6.4393174
22.23562 -0.0025801 0.2954562 -0.3042311 -0.7546739
X =
1. 0. 0. 0. 0.
0. 0.5 0. 0. 0.
0. 0. 32. 0. 0.
0. 0. 0. 16. 0.
0. 0. 0. 0. 64.