How to convert Maple Code to Matlab code
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Brendan O'Connor
el 4 de En. de 2017
Comentada: Stephen23
el 10 de Abr. de 2017
My class partner did our homework in Maple code, but to submit it we need it to work in Matlab. She did this when she was in her home country for the holidays and doesn't have access to Maple anymore (and neither do I), but I have read that there is a built in function in Maple that can do it automatically. Can someone convert this for me or at least show me how? I have no experience at all with Maple.
restart: with(LinearAlgebra)
n:=5; A:=Matrix(n,n); B:=Vector(n,[1.0,1.5,1.0,1.0,1.0]); BB:=Vector(n,[1.0,1.5,1.0,1.0,1.0]);
for i to n do
for j to n do
if j=i then A[i,j]:=2; end if;
if i+1=j or i-1=j then A[i,j]:=-1 end if;
end do;
end do;
print(A);
RR:=LinearSolve(A,BB,method='Cholesky', inplace); A; B;
print(A); print(B);
CONJUGENT GRADIENT METHOD:
niter:=5:
X:=Vector(n); R:=Vector(n);R1:=Vector(n);R2:=Vector(n); W:=Vector(n); P:=Vector(n);
for i to n do X[i]:=0.0: R1[i]:=B[i];end do;
GR1:=NULL:GR2:=NULL;
for k to niter do
if k=1 then for i to n do P[i]:=R1[i]: end do;
else
restart: with(LinearAlgebra):
n:=5; A:=Matrix(n,n); B:=Vector(n,[1.0,1.5,1.0,1.0,1.0]); BB:=Vector(n,[1.0,1.5,1.0,1.0,1.0]);
for i to n do
for j to n do
if j=i then A[i,j]:=2; end if;
if i+1=j or i-1=j then A[i,j]:=-1 end if;
end do;
end do;
print(A);
RR:=LinearSolve(A,BB,method='Cholesky', inplace); A; B;
print(A); print(B);
CONJUGENT GRADIENT METHOD:
niter:=5:
X:=Vector(n); R:=Vector(n);R1:=Vector(n);R2:=Vector(n); W:=Vector(n); P:=Vector(n);
for i to n do X[i]:=0.0: R1[i]:=B[i];end do;
GR1:=NULL:GR2:=NULL;
for k to niter do
if k=1 then for i to n do P[i]:=R1[i]: end do;
else
beta:=add(R1[j]^2,j=1..n)/add(R2[j]^2,j=1..n);
for i to n do P[i]:=R1[i]+beta*P1[i]: end do;
end if;
for i to n do W[i]:=add(A[i,j]*P[j],j=1..n); end do;
vard:=add(P[j]*W[j],j=1..n); printf("k=%d vard=%e\n",k,vard);
alfa:=add(R1[j]^2,j=1..n)/vard;
for i to n do X[i]:=X[i]+alfa*P[i]: end do;
for i to n do R[i]:=R1[i]-alfa*add(A[i,j]*P[j],j=1..n): R2[i]:=R1[i]; R1[i]:=R[i]; P1[i]:=P[i]; end do;
eps:=sqrt(add(R[j]*R[j],j=1..n)); printf("k=%d eps=%e\n",k,eps); print(X);
for i to n do W[i]:=add(A[i,j]*X[j],j=1..n):end do: func:=add(X[j]*W[j],j=1..n)-add(B[j]*X[j],j=1..n);
GR1:=GR1,[k,func]; GR2:=GR2,[k,eps]; printf("k=%d func=%e eps=%e\n",k,func, eps); print(A); print(B);
end do;
RR; X;
plot([GR1],axes=boxed); plot([GR2],axes=boxed);
beta:=add(R1[j]^2,j=1..n)/add(R2[j]^2,j=1..n);
for i to n do P[i]:=R1[i]+beta*P1[i]: end do;
end if;
for i to n do W[i]:=add(A[i,j]*P[j],j=1..n); end do;
vard:=add(P[j]*W[j],j=1..n); printf("k=%d vard=%e\n",k,vard);
alfa:=add(R1[j]^2,j=1..n)/vard;
for i to n do X[i]:=X[i]+alfa*P[i]: end do;
for i to n do R[i]:=R1[i]-alfa*add(A[i,j]*P[j],j=1..n): R2[i]:=R1[i]; R1[i]:=R[i]; P1[i]:=P[i]; end do;
eps:=sqrt(add(R[j]*R[j],j=1..n)); printf("k=%d eps=%e\n",k,eps); print(X);
for i to n do W[i]:=add(A[i,j]*X[j],j=1..n):end do: func:=add(X[j]*W[j],j=1..n)-add(B[j]*X[j],j=1..n);
GR1:=GR1,[k,func]; GR2:=GR2,[k,eps]; printf("k=%d func=%e eps=%e\n",k,func, eps); print(A); print(B);
end do;
RR; X;
plot([GR1],axes=boxed); plot([GR2],axes=boxed);
0 comentarios
Respuesta aceptada
Walter Roberson
el 4 de En. de 2017
The conversion tool in Maple, CodeGeneration[Matlab], cannot convert calls like LinSolve. And the parts it can convert of your code are not difficult to convert by hand. The conversion tool does a poor job formatting.
(I have a revised version that does better formatting but I have not been able to track down some significant bugs in what I wrote.)
4 comentarios
Stephen23
el 10 de Abr. de 2017
@Azamat Durzhanbayev: that is a nice screenshot, but what do you want us to do with it? It might look nice printed out and stuck on the wall.
Más respuestas (0)
Ver también
Categorías
Más información sobre Startup and Shutdown en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!