Страница 1 из 2

Оптимизация кода

Добавлено: Чт янв 25, 2007 12:25 am
Falex
Извините за такой вопрос.Изучаю Maple с сегодняшнего дня и вот какая проблема возникла:оптимизация кода.
Все дело в том,что код получается слишком горомоздким,хотя в других математических пакетах это делается достаточно
легко.Посоветуйте как можно избавиться от такой проблемы.
Вот файлик:

Добавлено: Чт янв 25, 2007 10:06 am
aar
Например:
> f := proc (zf) local j;
> add(abs((eval(find_cos, z = eval(zf, t = (j+1)/n)))-(eval(find_cos, z = eval(zf, t = j/n)))), j = 0 .. n)
> end proc:
> f(zf1)+f(zf2)+f(zf3)+f(zf4);
14.13556662

Добавлено: Чт янв 25, 2007 1:51 pm
Falex
А массив функций нельзя сделать:чтобы не писать zf1,zf2,zf3,zf4 а например zf[1],...ну типа как-нибудь так?

Добавлено: Чт янв 25, 2007 3:22 pm
aar
Можно массив, а можно и так:
add(f(zf||i), i=1..4);
14.13556662

Добавлено: Чт янв 25, 2007 3:36 pm
Falex
Вот еще вопросик.написал код,который рисует 4 отрезка на различных plot'aх.А мне надо на одном.Как этого добиться?

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

line:=proc(t,j) if (j=1) then 1-2*t-1*I elif (j=2) then 1+I*(-1+2*t) elif (j=3) then 1-2*t+1*I elif (j=4) then -1+I*(1-2*t) end if end proc;
for j from 1 to 4 do plot([Re(line(t,j)),Im(line(t,j)),t=0..1]): end do;

Добавлено: Чт янв 25, 2007 4:18 pm
Irmantas
line:=proc(t,j) if (j=1) then 1-2*t-1*I elif (j=2) then 1+I*(-1+2*t) elif (j=3) then 1-2*t+1*I elif (j=4) then -1+I*(1-2*t) end if end proc;
plots[display](seq(plot([Re(line(t,j)),Im(line(t,j)),t=0..1]),j=1..4));

Добавлено: Чт янв 25, 2007 4:33 pm
Falex
Спасибо.А почему здесь выдает ошибку,хотя делаю я всё правильно:

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

> line:=proc(t,j) if (j=1) then 1-2*t-1*I elif (j=2) then 1+I*(-1+2*t) elif (j=3) then 1-2*t+1*I elif (j=4) then -1+I*(1-2*t) end if end proc;
> z1:=-0.999-0.999*I;z2:=-z1;n=1000;

> find_cos:=proc(z) arccos(((Re(z)-Re(z1))*(Re(z)-Re(z1))+(Im(z)-Im(z1))*(Im(z)-Im(z1))+(Re(z)-Re(z2))*(Re(z)-Re(z2))+(Im(z)-Im(z2))*(Im(z)-Im(z2))-(Re(z1)-Re(z2))*(Re(z1)-Re(z2))-(Im(z1)-Im(z2))*(Im(z1)-Im(z2)))/(2*sqrt((Re(z)-Re(z1))*(Re(z)-Re(z1))+(Im(z)-Im(z1))*(Im(z)-Im(z1)))*sqrt((Re(z)-Re(z2))*(Re(z)-Re(z2))+(Im(z)-Im(z2))*(Im(z)-Im(z2))))) end proc;
> variation:=proc(j)::float; local summ::float,i::integer;summ:=0;
>   for i from 0 to n do summ:=summ+find_cos(line(i/n,j)) end do;
>   return summ;
> end proc;
> print(variation(3));
Error, (in variation) final value in for loop must be numeric or character

Добавлено: Чт янв 25, 2007 5:10 pm
Irmantas
рестартуй весь документ.
проедуру find_cos можно написать и папроще
find_cos:=z-> arccos(( abs(z-z1)^2+abs(z-z2)^2-abs(z1-z2)^2 )/(2*abs(z-z1)*abs(z-z2)));

Добавлено: Чт янв 25, 2007 7:14 pm
Falex
неа.Все равно эту ошибку выдает.Вот файлик:

Добавлено: Чт янв 25, 2007 8:46 pm
Irmantas
Falex писал(а):неа.Все равно эту ошибку выдает.Вот файлик:

забыли присваивание n.
n:=2000;

Добавлено: Пт янв 26, 2007 12:01 am
Falex
Вот блин:всего напрос-то точку с запятой забыл ;)
А почему ответ то не пишет,а такую строчку (при n=6):

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

evalf(variation(1));
find_cos(1 - I) + find_cos(2/3 - I) + find_cos(1/3 - I) + find_cos(-I) + find_cos(-1/3 - I) + find_cos(-2/3 - I) + find_cos(-1 - I)

Добавлено: Пт янв 26, 2007 2:09 pm
Irmantas
Falex писал(а):А почему ответ то не пишет,а такую строчку (при n=6):

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

evalf(variation(1));
find_cos(1 - I) + find_cos(2/3 - I) + find_cos(1/3 - I) + find_cos(-I) + find_cos(-1/3 - I) + find_cos(-2/3 - I) + find_cos(-1 - I)

при n:=6
variation(1) выводит резултат 11.64999743
сделайте рестарт

Добавлено: Пт фев 02, 2007 1:42 pm
Falex
А как сделать рестарт?!
Просто выход из программы и запуск заново не поможет?

Добавлено: Пт фев 02, 2007 8:30 pm
Irmantas
Falex писал(а):А как сделать рестарт?!
Просто выход из программы и запуск заново не поможет?

просто напишите в начале документа restart: и нажмите кнопку с "!!!"

Добавлено: Пт фев 02, 2007 10:56 pm
Falex
Все равно не помогло (