Maple 15 の計算アルゴリズムの改良
|
はじめに
|
|
Maple 15 では、記号計算と数値計算の両方について、新規または強化された計算アルゴリズムを提供します。
|
|
最適化
|
|
•
|
Optimization[LPSolve] に新しい反復内点法が追加されました。この計算法は、ウォータールー大学の H. Wolkowicz 博士等の開発によるものです。この方法は、大型の疎線形プログラム問題において、従来の有効制約法に比べ効率が大幅に改善されています。
|
|
|
多項式演算
|
|
•
|
プログラムの改良により、高次かつ密な多項式の乗算、除算、累乗で処理速度が 4 倍以上になっています。メモリ使用は Maple 14 よりも 3/4 以上少なくなっています。
|
•
|
以下、効率のよい乗算、累乗、除算、法演算の例を示します。
|
>
|
f,g := seq(randpoly(x,degree=10^4,dense),i=1..2):
|
>
|
p := CodeTools[Usage](expand(f*g)):
|
memory used=1.70MiB, alloc change=1.87MiB, cpu time=68.00ms, real time=69.00ms
| |
>
|
p := CodeTools[Usage](expand((5*x-3*y)^10000)):
|
memory used=34.72MiB, alloc change=34.62MiB, cpu time=251.00ms, real time=251.00ms
| |
>
|
f := Expand((1+x+y+z+t)^30) mod n:
|
>
|
CodeTools[Usage](Divide(f,1+x+y+z+t,'q') mod n);
|
memory used=4.79MiB, alloc change=4.75MiB, cpu time=169.00ms, real time=169.00ms
| |
| (3.1) |
•
|
divide は、二つのコマンドで見られるな多項式が割り切れない場合、すぐに判定します。
|
>
|
f,g := seq(randpoly([x,y,z],degree=30,terms=3000),i=1..2):
|
>
|
CodeTools[Usage](divide(p,f,'q')); # computes quotient
|
memory used=227.52KiB, alloc change=0 bytes, cpu time=901.00ms, real time=901.00ms
| |
| (3.2) |
>
|
CodeTools[Usage](divide(p+1,f,'q')); # fails instantly
|
memory used=0.61MiB, alloc change=0 bytes, cpu time=83.00ms, real time=83.00ms
| |
| (3.3) |
>
|
f:='f': g:='g': n:='n': p:='p':
|
|
|
スパース行列
|
|
•
|
スパース行列の様々な演算のサポートが大幅に改善されました。ハードウェアのネーティブサポートにより、浮動小数点乗算、転置、ブロックコピー、結合、部分行列の抽出が瞬時に計算できるようになりました。
|
>
|
M := LinearAlgebra[RandomMatrix](1000,storage=rectangular,density=.003,datatype=float):
|
>
|
time(Matrix(M,storage=sparse));
|
|
# now .012s vs .200s in Maple 14
|
>
|
M1 := LinearAlgebra[RandomMatrix](1000,storage=sparse,density=.003,datatype=float):
|
>
|
M2 := LinearAlgebra[RandomMatrix](1000,storage=sparse,density=.003,datatype=float):
|
|
# now .004s vs .032s in Maple 14
|
>
|
time(Matrix(M1,transpose=true));
|
>
|
time(Matrix(M1,storage=rectangular));
|
>
|
MD := LinearAlgebra[RandomMatrix](1000,shape=diagonal,datatype=float):
|
>
|
V1 := Vector([seq(2*i,i=1..500)]);
|
| (4.1) |
|
|
高精度代数リカッチ方程式
|
|
•
|
線形代数 パッケージの高精度代数リカッチ方程式解法
|
•
|
連続・離散の代数リカッチ方程式を解くための CARE と DARE の各コマンドは、ハードウェア倍精度以上で動作するように強化されました。
|
>
|
A := Matrix([[1.0, .2, 1.0], [0., .1, .45], [2.0, 2.3, 1.3]]);
|
| (5.1) |
>
|
B := Matrix([[0, 1], [0, 0], [1, 0]]);
|
| (5.2) |
>
|
Q := Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]]);
|
| (5.3) |
>
|
R := Matrix([[1.0, 0.], [0., 1.0]]);
|
| (5.4) |
| (5.5) |
| (5.6) |
|
|
パラメトリック解
|
|
|
場合分けのある多項方程式解
|
|
>
|
SolveTools[Parametric]({a*x}, {x}, {a});
|
| (6.1.1) |
•
|
デフォルトとして、これらの新しいコマンドは区分的な解を戻しますが、それは最も一般的な場合の解と、不活性な 関数コールを含むその他の場合の解を含みます。
|
>
|
result := SolveTools[Parametric]({a*x^2-(b+a)*x+b}, {x});
|
| (6.1.2) |
>
|
result := eval(result, a=0);
|
| (6.1.3) |
| (6.1.4) |
>
|
solve( a*x^2-(b+a)*x+b, x, 'parametric');
|
| (6.1.5) |
|
|
定和分
|
|
•
|
sum コマンドは、パラメトリックな境界を持つ定和分が扱えるように改良されました。 parametric オプションで動作を制御できます。
|
Warning, unable to determine if the summand is singular in the interval of summation; try to use assumptions or use the parametric option
| |
| (6.2.1) |
>
|
sum(1/k, k=a..b, parametric);
|
| (6.2.2) |
>
|
DefiniteSum[Definite](binomial(2*k-3, k)/4^k, k=0..n, parametric);
|
| (6.2.3) |
•
|
ノンパラメトリックな定和分について、除去可能な特異点の扱いが改良されました。デフォルトの挙動としてそのような特異点は除去されますが、 _EnvFormal を false に設定することで除去しないようにできます。
|
>
|
sum(1/GAMMA(k), k=-1..5);
|
| (6.2.4) |
| (6.2.5) |
>
|
sum(1/GAMMA(k), k=-1..5);
|
Error, (in SumTools:-DefiniteSum:-ClosedForm) summand is singular in the interval of summation
| |
|
|
SumTools のその他の改良
|
|
>
|
with(SumTools[Hypergeometric]):
|
>
|
Gosper((-1)^k*binomial(n,k), k, 'r');
r;
|
| (6.3.1) |
>
|
DefiniteSum(1/(m^2+k^2)^2, m, k, 0..m);
|
| (6.3.2) |
>
|
DefiniteSumAsymptotic(1/(m^2+k^2)^2, m, k, 0..m);
|
| (6.3.3) |
|
|
RegularChains
|
|
>
|
R := PolynomialRing([z,y,x]):
|
•
|
Zeck 代数曲面は次の方程式で定義されます。不等式による制約は曲面の一部を選択するために加えてあります。
|
>
|
F := [x^2+y^2-z^3*(1-z) = 0, 5*y> 1, z<=2];
|
| (6.4.1) |
•
|
下記は、実数解を公式により完全に記述したものです。
|
>
|
RealTriangularize(F, R,output=record);
|
| (6.4.2) |
>
|
SamplePoints(F, R,output=record);
|
| (6.4.3) |
>
|
F2 := [x^3+y^2*z^3-y*z^4 ];
|
| (6.4.4) |
>
|
RealTriangularize(F2, R, output=record);
|
| (6.4.5) |
|
|
RootFinding[Parametric]
|
|
>
|
with(RootFinding[Parametric]):
|
>
|
m := CellDecomposition([x^2+a*x+b = 0], [x], 'method' = 'RC'):
|
>
|
CellPlot(m, 'samplepoints');
|
| (6.5.1) |
|
|
|
統計
|
|
>
|
Statistics[CrossCorrelation](<1,2,1,2>, <2,1,2,1>, 2);
|
| (7.1) |
>
|
Statistics[AutoCorrelation](<1,-1,1,-1>, 2);
|
| (7.2) |
|
|