maxal писал(а):
Мапл - это и есть пакет, "пустое решение" означает, что решений нет (с точностью до багов в мапле).
Багов в Мапле хватает.
Не рекомендую использовать оператор
solve и производные от него. Находит ответ не всегда, но даже когда находит, ответ может быть неверным, даже для простейшей линейной системы.
У меня набросано несколько программок, для решения систем линейных уравнений.
Вот одна из них: процедура приведения к канонической линейной форме
Код:
> klfd:=proc(A,B,m,n)
> klf:=proc(A,B,m,n)
> local a,b,c,h,i,j,k,l,r,u;
> c:=matrix([seq([seq(convert(A[i,j],rational,exact),j=1..n),convert(B[i],rational,exact)],i=1..m)]);
> u:=vector(n+1); l:=0; j:=0; while j<n do j:=j+1; i:=l; while i<m and c[i+1,j]=0 do i:=i+1 od; if i<m then i:=i+1; l:=l+1; for k from j+1 to n+1 do h:=c[i,k]/c[i,j]; c[i,k]:=c[l,k]; c[l,k]:=h od; c[i,j]:=c[l,j]; c[l,j]:=1; for i from i+1 to m do if c[i,j]<>0 then for k from j+1 to n+1 do c[i,k]:=c[i,k]-c[i,j]*c[l,k] od fi; c[i,j]:=0 od; u[l]:=j fi od;
> i:=l; while i<m and c[i+1,n+1]=0 do i:=i+1 od;
> if i=m then a:=matrix(n,n-l); b:=vector([seq(0,i=1..n)]); u[l+1]:=n+1;
> for i from l by -1 to 1 do for j to u[i]-i do a[u[i],j]:=0 od; for k from i to l do for j from u[k]+1 to u[k+1]-1 do a[u[i],j-k]:=-c[i,j]-add(c[i,u[r]]*a[u[r],j-k],r=i+1..k) od od; b[u[i]]:=c[i,n+1]-add(c[i,u[r]]*b[u[r]],r=i+1..l);
> for k from u[i]+1 to u[i+1]-1 do for j to n-l do a[k,j]:=0 od; a[k,k-i]:=1 od od;
> for k from 1 to u[1]-1 do for j to n-l do a[k,j]:=0 od; a[k,k]:=1 od;
> RETURN([evalm(a),<seq(b[i],i=1..n)>,l]) else RETURN([[],[],n+1]) fi
> RETURN([a,b,l]) else RETURN([[],[],n+1]) fi
> end:
оставьте одну из строк с RETURN, другую удалите. Первый RETURN - для демонстрации результата, второй используйте для промежуточных расчетов. Со строками proc(A,B,m,n) поступите соответственно.
Здесь, аргументы:
- матрица коэффициентов,
- вектор свободных членов,
- число уравнений (строк матрицы),
- число переменных (столбцов матрицы); результат:
- матрица коэффициентов и
- вектор свободных членов для выражения переменных через свободные параметры,
- число линейно
независимых уравнений системы=число линейно зависимых переменных системы (если она совместна, иначе
), тогда
- размерность пространства решений (число свободных параметров; равно
, если система несовместна).
Пронаблюдайте:
Код:
> A:=matrix([[1,-2,0,1],[3,-1,-2,0],[2,1,-2,-1]]); B:=<-3,1,4>; m:=3; n:=4; C:=klfd(A,B,m,n); piecewise(seq(op([l=i,x[i]=add(C[1][i,j]*alpha[j],j=1..n-C[3])+C[2][i]]),i=1..n));
Вот процедурки для приведения системы уравнений магического квадрата:
здесь, аргументы:
- размерность квадрата,
- список векторов направлящих для пучков паралельных прямых, по которым имеет место "магическое" равенство сумм (компоненты направляющих векторов взаимно просты с
, либо равны
),
- число "магических" пучков паралельных прямых,
- вектор (тип name, либо vector/list of name) линейно независимых элементов магического квадрата,
- имя переменной, обозначающей магическую сумму;
для простого магического (без магических диагоналей) квадрата
,
для пандиагонального магического квадрата
;
Код:
> magkvad01:=proc(n,v,q)
> local a,b,h,i,j,k,l,m,o;
> o:=n^2+1; a:=matrix([seq([seq(0,j=1..o)],i=1..n*q)]); k:=0;
> for h to q do if v[h,2]=0 then if v[h,1]=0 then l:=0 else l:=2 fi else l:=1 fi; b:=[0,0]; for i to n do k:=k+1; for j to n do a[k,n*b[1]+b[2]+1]:=1; b:=[b[1]+v[h,1] mod n,b[2]+v[h,2] mod n] od; a[k,n^2+1]:=-1; b[l]:=b[l]+1 od od;
> RETURN(evalm(a))
> end:
результат:
- матрица коэффициентов системы уравнений магического квадрата от
переменных (элементов квадрата и, последняя по счету переменная, магической суммы), вектор свободных членов нулевой.
Пронаблюдайте:
Код:
> magkvad01(2,[[0,1],[1,0]],2);
Код:
> magkvad02:=proc(n,v,q)
> local a,b,h,i,j,k,l,m,o;
> o:=n^2+1; a:=matrix([seq([seq(0,j=1..o)],i=1..n*q)]); k:=0;
> for h to q do if v[h,2]=0 then if v[h,1]=0 then l:=0 else l:=2 fi else l:=1 fi; b:=[0,0]; for i to n do k:=k+1; for j to n do a[k,n*b[1]+b[2]+1]:=1; b:=[b[1]+v[h,1] mod n,b[2]+v[h,2] mod n] od; a[k,n^2+1]:=-1; b[l]:=b[l]+1 od od;
> RETURN(klf(a,[seq(0,i=1..n*q)],n*q,o))
> end:
результат
:
- матрица коэффициентов и
- вектор свободных членов для выражения переменных через свободные параметры,
- число линейно
независимых уравнений системы=число линейно зависимых переменных системы (если она совместна, иначе
), тогда
- размерность пространства решений (число свободных параметров; равно
, если система несовместна).
Пронаблюдайте:
Код:
> magkvad02(2,[[0,1],[1,0]],2);
Код:
> magkvad03:=proc(n,v,q,x,s)
> local a,b,h,i,j,k,l,m,o;
> o:=n^2+1; a:=matrix([seq([seq(0,j=1..o)],i=1..n*q)]); k:=0;
> for h to q do if v[h,2]=0 then if v[h,1]=0 then l:=0 else l:=2 fi else l:=1 fi; b:=[0,0]; for i to n do k:=k+1; for j to n do a[k,n*b[1]+b[2]+1]:=1; b:=[b[1]+v[h,1] mod n,b[2]+v[h,2] mod n] od; a[k,n^2+1]:=-1; b[l]:=b[l]+1 od od;
> a:=klf(a,[seq(0,i=1..n*q)],n*q,o); b:=matrix(n,n);
> k:=0; for i to n do for j to n do k:=k+1; b[j,i]:=add(a[1][k,l]*x[l],l=1..o-a[3]-1)+a[1][k,o-a[3]]*s+a[2][k] od od;
> RETURN(evalm(b),o-a[3])
> end:
результат:
- матрица элементов магического квадрата, выраженных через линейно независимые переменные,
- число линейно независимых переменных магического квадрата.
Пронаблюдайте:
Код:
> magkvad03(2,[[0,1],[1,0]],2,x,s); magkvad03(2,[[0,1],[1,0],[1,1]],3,x,s);
> magkvad03(3,[[0,1],[1,0]],2,x,s); magkvad03(3,[[0,1],[1,0],[1,1]],3,x,s); magkvad03(3,[[0,1],[1,0],[1,1],[1,-1]],4,x,s);
> magkvad03(4,[[0,1],[1,0]],2,x,s); magkvad03(4,[[0,1],[1,0],[1,1]],3,x,s); magkvad03(4,[[0,1],[1,0],[1,1],[1,-1]],4,x,s);
> magkvad03(5,[[0,1],[1,0],[1,1]],3,x,s); magkvad03(5,[[0,1],[1,0],[1,1],[1,-1]],4,x,s); magkvad03(5,[[0,1],[1,0],[1,1],[1,-1],[1,2]],5,x,s); magkvad03(5,[[0,1],[1,0],[1,1],[1,-1],[1,2],[1,-2]],6,x,s);