我想知道您以前是否尝试使用sym/linsolve和sym/solve,但是可能已经传递了数字而不是符号值.例如,这将根据您的查找返回废话:
A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
s = mod(linsolve(A,b),8)
但是,如果将数值转换为符号整数,则sym / linsolve会将所有内容保留为有理数.然后
s = mod(linsolve(sym(A),sym(b)),8)
返回预期的答案
s =
6
1
6
4
这只是使用符号数学来解决系统线性系统,就好像它是一个正常矩阵一样.对于大型系统,这可能会很昂贵,但我想不超过使用MuPAD的numeric::linsolve或linalg::matlinsolve.sym/mod应该返回每个解决方案组件的分子模数.我相信,如果模数和分母不小于coprime,您会得到一个错误.
sym / solve也可以类似的方式用于解决此问题:
L = sym('L',[4,1]);
[L1,L2,L3,L4] = solve(A*L==b);
s = mod([L1;L2;L3;L4],8)
使用sym / solve或sym / linsolve的一个可能的问题是,如果线性一致问题(与线性系统相反)有多个解决方案,则此方法可能不会全部返回.
最后,使用MuPAD函数numlib::ichrem(整数的中文余数定理),下面的代码尝试获得完整的解决方案:
A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
m = 10930888;
mf = str2num(strrep(char(factor(sym(m))),'*',' '));
A = sym(A);
b = sym(b);
s = sym(zeros(length(b),length(mf)));
for i = 1:length(mf)
s(:,i) = mod(linsolve(A,b),mf(i));
end
mstr = ['[' sprintf('%d,',mf)];
mstr(end) = ']';
r = sym(zeros(length(b),1));
for i = 1:length(b)
sstr = char(s(i,:));
r(i) = feval(symengine,'numlib::ichrem',sstr(9:end-2),mstr);
end
check = isequal(mod(A*r,m),b)
我不确定您是否正在寻找其中的任何一个,但希望它会有所帮助.我认为最好在MathWorks中放入enhancement/service request,以便MuPAD和其他求解器将来可以更好地处理系统.