Ошибка в процедуре

Форум пользователей пакета Maple

Модератор: Admin

milka49513
Сообщения: 11
Зарегистрирован: Ср май 14, 2014 10:48 pm
Контактная информация:

Ошибка в процедуре

Сообщение milka49513 » Сб ноя 08, 2014 1:06 am

Здравствуйте! Помогите пожалуйста найти ошибку. Эта процедура вычисляет каноническую форму УрЧП. Брала ее из книжки Голоскокова. При запуске выдает ошибку: Error, reserved word `end` unexpected



Код: Выделить всё

canon_form:=proc(equ)
global change_of_variables, eq_can;
local k, A, B, it, J, eq_n, r, tr, i, itr, eq_type, mu, eq,
characteristics:
eq:=lhs(equ);
A:=linalg[matrix](2,2,[coeff(eq,diff(u(x,y),x,x)),
coeff(eq,diff(u(x,y),x,y))/2,
coeff(eq,diff(u(x,y),x,y))/2,
coeff(eq,diff(u(x,y),y,y))]
);
simplify({solve(A[1,1]*z^2-2*A[1,2]*z+A[2,2],z)});
simplify(%,power); simplify(%,power,symbolic);
subs(y=y(x),%);
if type(%[1], '*') and has(%[1],y) and has(%[1],I) then
mu:=1/select(has(%[1],y)):
{seq(int(expand((diff(y(x),x)+%%[i])*mu),x)=_C1,
i=1..nops(%%))}:
else
{seq(dsolve(diff(y(x),x)=%[i],y(x)), i=1..nops(%))};



end if;
characteristics:=subs(y(x)=y,%);
print('Характеристики:'); print(characteristics);
{seq(solve(characteristics[i],_C1),
i=1..nops(characteristics))};
if nops(%)=1 and not hastype(%, nonreal) then
itr:={xi=%[1], eta=x}:
eq_type:='параболический тип';
elif not hastype(%,nonreal) then
itr:={xi=(%[1]+%[2]]/2, eta=(%[2]-%[1])/2}:
eq_type:='гиперболический тип':
else
itr:={xi=coeff(%[1],I), eta=%[1]-coeff(%[1],I)*I};
eq_type:='эллиптический тип';

end if;
itr:=simplify(itr): indets(itr);
select(has,%,[x,y]);
k:=solve(itr,%);
it:=convert(itr,list);



if has(%[1],eta) then it:=[%[2],%[1]] end if;
J:=jacobian([rhs(it[1]), rhs(it[2])],[x,x]):
B:=map(simplify, evalm(J&*A&*tranpose(J)));
eq_n:=B[1,1]*Diff(u,xi,xi)+2B[1,2]*Diff(u,xi,eta)+B[2,2]*Diff(u, eta, eta)+ simplify(subs(u(x,y)=rhs(it[1]),eq))*Diff(u,xi)+ simplify(subs(u(x,y)=rhs(it[2], eq))*Diff(u,eta);
eq_n:=expand(eq_n);
k union map(x->1/lhs(x)=1/rhs(x),k);
subs(%, eq_n);
if eq_type='параболический тип' then
simplify(solve(%,Diff(u,eta,eta))):


r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%,[x,y]) then
tr:=solve(itr, {x,y})
if has(%,RootOf) then tr:=allvalues(%)[l] end if;
simlify(expand(subs(tr,r)));
end if;
eq_can:=Diff(u,eta,eta)-%=0;
end if;
if eq_tyre='гиперболический тип' then
simplify(solve(eq_n,Diff(u,eta,eta)));
r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%,[x,y]) then tr:=solve(itr,{x,y});
if has(%, RootOf) then tr:=allvalues(%)[l] end if;
simplify(expand(subs(tr,r)));
end if;
eq_can:=Diff(u,eta.eta)-Diff(u,xi,xi)-
simplify(%-Diff(u,xi,xi))=0;
end if;
if eq_type='эллиптический тип' then
simplify(solve(%,Diff(u,xi,xi)));
r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%, [x,y]) then tr:=solve(itr,{x,y});
if has(%, RootOf) then tr:=allvalues(%)[l] end if:


map(simplify, subs(tr,r), trig,power,symbolic);
end if;
eq_can:=Diff(u,eta,eta)+Diff(u,xi,xi)-
simplify(%+Diff(u,eta,eta))=0;
end if;
change_of_variables:=itr;

print(eq_type); print('Замена переменных;'); print(itr);

print('Каноническая форма;');

eq_can:=value(subs(u=u(eta,xi),eq_can));

RETURN(eq_can);


end proc.
[/list][/list]

Markiyan Hirnyk
Сообщения: 1366
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Копирование?

Сообщение Markiyan Hirnyk » Сб ноя 08, 2014 9:39 pm

Скопировав и выполнив Ваш код (без точки в конце), получил сообщение
Error, unable to match delimiters
Проверьте правильность копирования. Полезно также приложить файл с Вашими попытками.

Kitonum
Сообщения: 2084
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Исправленный код

Сообщение Kitonum » Сб ноя 08, 2014 9:50 pm

canon_form:=proc(equ)
global change_of_variables, eq_can;
local k, A, B, it, J, eq_n, r, tr, i, itr, eq_type, mu, eq,
characteristics;
uses linalg;
eq:=lhs(equ);
A:=matrix(2,2,[coeff(eq,diff(u(x,y),x,x)),
coeff(eq,diff(u(x,y),x,y))/2,
coeff(eq,diff(u(x,y),x,y))/2,
coeff(eq,diff(u(x,y),y,y))]);

simplify({solve(A[1,1]*z^2-2*A[1,2]*z+A[2,2],z)});
simplify(%,power); simplify(%,power,symbolic);
subs(y=y(x),%);
if type(%[1], `*`) and has(%[1],y) and has(%[1],I) then
mu:=1/select(has(%[1],y)):
{seq(int(expand((diff(y(x),x)+%%[i])*mu),x)=_C1,
i=1..nops(%%))}:
else
{seq(dsolve(diff(y(x),x)=%[i],y(x)), i=1..nops(%))};

end if;
characteristics:=subs(y(x)=y,%);
print(`Характеристики:`); print(characteristics);
{seq(solve(characteristics[i],_C1),
i=1..nops(characteristics))};
if nops(%)=1 and not hastype(%, nonreal) then
itr:={xi=%[1], eta=x}:
eq_type:=`параболический тип`;
elif not hastype(%,nonreal) then
itr:={xi=(%[1]+%[2])/2, eta=(%[2]-%[1])/2}:
eq_type:=`гиперболический тип`:
else
itr:={xi=coeff(%[1],I), eta=%[1]-coeff(%[1],I)*I};
eq_type:=`эллиптический тип`;

end if;
itr:=simplify(itr): indets(itr);
select(has,%,[x,y]);
k:=solve(itr,%);
it:=convert(itr,list);

if has(%[1],eta) then it:=[%[2],%[1]] end if;
J:=jacobian([rhs(it[1]), rhs(it[2])],[x,y]):
B:=map(simplify, evalm(J&*A&*transpose(J)));
eq_n:=B[1,1]*Diff(u,xi,xi)+2*B[1,2]*Diff(u,xi,eta)+B[2,2]*Diff(u, eta, eta)+ simplify(subs(u(x,y)=rhs(it[1]),eq))*Diff(u,xi)+ simplify(subs(u(x,y)=rhs(it[2]), eq))*Diff(u,eta);
eq_n:=expand(eq_n);
k union map(x->1/lhs(x)=1/rhs(x),k);
subs(%, eq_n);
if eq_type=`параболический тип` then
simplify(solve(%,Diff(u,eta,eta))):


r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%,[x,y]) then
tr:=solve(itr, {x,y});
if has(%,RootOf) then tr:=allvalues(%)[l] end if;
simplify(expand(subs(tr,r)));
end if;
eq_can:=Diff(u,eta,eta)-%=0;
end if;
if eq_tyre=`гиперболический тип` then
simplify(solve(eq_n,Diff(u,eta,eta)));
r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%,[x,y]) then tr:=solve(itr,{x,y});
if has(%, RootOf) then tr:=allvalues(%)[l] end if;
simplify(expand(subs(tr,r)));
end if;
eq_can:=Diff(u,eta.eta)-Diff(u,xi,xi)-
simplify(%-Diff(u,xi,xi))=0;
end if;
if eq_type=`эллиптический тип` then
simplify(solve(%,Diff(u,xi,xi)));
r:=simplify(subs(k,numer(%))/subs(k,denom(%)));
if has(%, [x,y]) then tr:=solve(itr,{x,y});
if has(%, RootOf) then tr:=allvalues(%)[l] end if:

map(simplify, subs(tr,r), trig,power,symbolic);
end if;
eq_can:=Diff(u,eta,eta)+Diff(u,xi,xi)-
simplify(%+Diff(u,eta,eta))=0;
end if;
change_of_variables:=itr;

print(eq_type); print(`Замена переменных;`); print(itr);

print(`Каноническая форма;`);

eq_can:=value(subs(u=u(eta,xi),eq_can));

return(eq_can);

end proc:


Пример из книги Голоскокова:

a:=x^2,-2*x,1,0,0;
equ:=a[1]*diff(u(x,y),x,x)+a[2]*diff(u(x,y),x,y)+a[3]*diff(u(x,y),y,y)+a[4]*diff(u(x,y),x)+a[5]*diff(u(x,y),y)=0;
canon_form(equ);


Изображение