Запись и чтение данных

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

Модератор: Admin

renuar911
Сообщения: 208
Зарегистрирован: Сб дек 20, 2008 11:26 pm

Запись и чтение данных

Сообщение renuar911 » Вс сен 29, 2013 12:13 pm

Можете подсказать, как записать вычисленные параметры в файл (например, координаты точек x и y), а затем написать другую программу и в ней эти данные прочитать для дальнейшего анализа? Мне бы простенький пример, чтобы понять суть. Все координаты целочисленные.

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

Re: Запись и чтение данных

Сообщение Markiyan Hirnyk » Вс сен 29, 2013 6:44 pm

renuar911 писал(а):Можете подсказать, как записать вычисленные параметры в файл (например, координаты точек x и y), а затем написать другую программу и в ней эти данные прочитать для дальнейшего анализа? Мне бы простенький пример, чтобы понять суть. Все координаты целочисленные.
Пожалуйста, уточните тип файла: .txt, xls,... Да, кстати, напомню Вам мой вопрос в http://forum.exponenta.ru/viewtopic.php?t=12863 .

renuar911
Сообщения: 208
Зарегистрирован: Сб дек 20, 2008 11:26 pm

Re: Запись и чтение данных

Сообщение renuar911 » Пн сен 30, 2013 11:18 am

Markiyan Hirnyk писал(а):
renuar911 писал(а):Можете подсказать, как записать вычисленные параметры в файл (например, координаты точек x и y), а затем написать другую программу и в ней эти данные прочитать для дальнейшего анализа? Мне бы простенький пример, чтобы понять суть. Все координаты целочисленные.
Пожалуйста, уточните тип файла: .txt, xls,... Да, кстати, напомню Вам мой вопрос в http://forum.exponenta.ru/viewtopic.php?t=12863 .


Лучше текстовой файл .txt

По поводу решения кубического уравнения, то выразил их в виде цепных дробей: http://s018.radikal.ru/i527/1309/b6/974119e5daf1.jpg

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

Re: Запись и чтение данных

Сообщение Markiyan Hirnyk » Пн сен 30, 2013 11:39 am

renuar911 писал(а):
Markiyan Hirnyk писал(а):[

Лучше текстовой файл .txt

По поводу решения кубического уравнения, то выразил их в виде цепных дробей: http://s018.radikal.ru/i527/1309/b6/974119e5daf1.jpg
1. Постараюсь как можно скорее дать Вам содержательный ответ.
2. Рассматриваю Ваш ответ как отписку: отсутствуют объяснения. Искренне, М. Г.

Keme
Сообщения: 34
Зарегистрирован: Пт янв 29, 2010 2:57 pm

схожая задача по записи данных

Сообщение Keme » Чт окт 03, 2013 7:43 pm

Имеется программа

restart;
fd := fopen("D:\\res.txt", WRITE);
f := 360+900*z;
g := 360-1260*z;
with(plots);
implicitplot({evalc(abs(eval(f/g, z = x+I*y))) <= 1}, x = -3 .. 3, y = -3 .. 3, gridrefine = 2, crossingrefine = 2)

#for .. to .. do fprintf(fd, "%.5g %.5g \\n", ?, ?);od;
#fclose(fd);

Результат визуально отображается на рабочем листе в виде графика. Требуется сохранить результат в файле (txt) в виде двух колонок. В первую колонку записать вещественную часть, во вторую -- мнимую часть полученного выражения.

Пока запись не работает, закрыл комментариями строки, отвечающие за запись в файл.

VSI
Сообщения: 305
Зарегистрирован: Вт мар 15, 2005 6:40 pm
Откуда: Мариуполь

Re: схожая задача по записи данных

Сообщение VSI » Пт окт 04, 2013 10:02 pm

Keme писал(а):...Требуется сохранить результат в файле (txt) в виде двух колонок. В первую колонку записать вещественную часть, во вторую -- мнимую часть полученного выражения...

Попробуйте так...
fd := fopen("D:\\res.txt", WRITE):
for x from -3 to 3 do
for y from -3 to 3 do
fprintf(fd, "%10.5g %10.5g \n", Re((evalc(360+900*(x+I*y)/(360-1260*(x+I*y))))), Im((evalc(360+900*(x+I*y)/(360-1260*(x+I*y))))));
end do;
end do;
fclose(fd);

Keme
Сообщения: 34
Зарегистрирован: Пт янв 29, 2010 2:57 pm

Re: схожая задача по записи данных

Сообщение Keme » Сб окт 05, 2013 6:39 am

VSI, спасибо, запись в файл работает.
Подскажите, пожалуйста, как можно учесть условие
{evalc(abs(eval(f/g, z = x+I*y))) <= 1}-- ?

пробую вот так

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

fd := fopen("D:\\res7.txt", WRITE);
for x from -3 to 3 do
for y from -3 to 3 do
if evalc(360+(900*(x+I*y))/(360-1260*(x+I*y))) <= 1 then fprintf(fd, "%10.5g %10.5g \n", Re(evalc(360+(900*(x+I*y))/(360-1260*(x+I*y)))), Im(evalc(360+(900*(x+I*y))/(360-1260*(x+I*y)))))
end if
end do
end do;
fclose(fd);


файл получается пустой.

VSI
Сообщения: 305
Зарегистрирован: Вт мар 15, 2005 6:40 pm
Откуда: Мариуполь

Re: схожая задача по записи данных

Сообщение VSI » Сб окт 05, 2013 6:40 pm

Keme писал(а):...Подскажите, пожалуйста, как можно учесть условие
{evalc(abs(eval(f/g, z = x+I*y))) <= 1}-- ?...

Я думаю, что НЕЛЬЗЯ так просто сравнивать комплексное число с вещественным!

Keme
Сообщения: 34
Зарегистрирован: Пт янв 29, 2010 2:57 pm

Re: схожая задача по записи данных

Сообщение Keme » Вс окт 06, 2013 5:35 am

VSI писал(а):Я думаю, что НЕЛЬЗЯ так просто сравнивать комплексное число с вещественным!


VSI, спасибо за комментарий. В формуле
{evalc(abs(eval(f/g, z = x+I*y))) <= 1} есть функция abs() -- модуль числа, в результате получаем радиус-вектор, а это уже вещественное число. А в условии я не написал abs().

Написал вот так

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

fd := fopen("D:\\res7.txt", WRITE);
for x from -3 to 3 do
for y from -3 to 3 do
if evalc(abs(360+(900*(x+I*y))/(360-1260*(x+I*y)))) <= 1 then fprintf(fd, "%10.5g %10.5g \n", Re(evalc(360+(900*(x+I*y))/(360-1260*(x+I*y)))), Im(evalc(360+(900*(x+I*y))/(360-1260*(x+I*y)))))
end if
end do
end do;
fclose(fd);

В результате возникает ошибка:
Error, cannot determine if this expression is true or false: (15/97)*5399117^(1/2) <= 1

VSI
Сообщения: 305
Зарегистрирован: Вт мар 15, 2005 6:40 pm
Откуда: Мариуполь

Re: схожая задача по записи данных

Сообщение VSI » Пн окт 07, 2013 1:33 pm

У Вас: evalc
if evalc(abs(360+(900*(x+I*y))/(360-1260*(x+I*y)))) <= 1
Измените на: evalf
if evalf(abs(360+(900*(x+I*y))/(360-1260*(x+I*y)))) <= 1
Все будет считать... Но! Файл будет пустым, так как ВСЕ значения будут < 1....... А если измените отношение на >=, то ВСЕ запишется в файл.

Keme
Сообщения: 34
Зарегистрирован: Пт янв 29, 2010 2:57 pm

схожая задача по записи данных

Сообщение Keme » Пн окт 07, 2013 2:40 pm

VSI, спасибо за помощь. Запись в файл налажена.

Теперь пробую оптимизировать код и вынести определение числителя и знаменателя, которые используются в условии и расчетах, до циклов. Пишу вот так:

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

restart;
fd := fopen("D:\\res10.txt", WRITE);
f := 360+900*z;
g := 360-1260*z;
evalc(abs(eval(f/g, z = x+I*y)));
for x from -3 to 3 do
for y from -3 to 3 do
if evalf(abs(f/g) >= 1.0) then
fprintf(fd, "%10.5g %10.5g \n", Re(evalc(f/g)), Im(evalc(f/g)))
end if
end do
end do;
fclose(fd)


При этом ошибка Error, cannot determine if this expression is true or false: 1.0 <= abs((360.+900.*z)/(360.-1260.*z))

Почему в условии if() в качестве переменной подставляется z? До циклов по x и у использована функция evalc(abs(eval(f/g, z = x+I*y))), на экране я вижу, что переменные x, y подставлены в функции f и g.

VSI
Сообщения: 305
Зарегистрирован: Вт мар 15, 2005 6:40 pm
Откуда: Мариуполь

Re: схожая задача по записи данных

Сообщение VSI » Пн окт 07, 2013 5:05 pm

А так...
restart;
fd := fopen("D:\\res10.txt", WRITE);
z := x+I*y;
f := 360+900*z;
g := 360-1260*z;
evalc(abs(eval(f/g)));
for x from -3 to 3 do
for y from -3 to 3 do
if evalf(abs(f/g)) >= 1.0 then
fprintf(fd, "%10.5g %10.5g \n", Re(evalc(f/g)), Im(evalc(f/g)));
end if;
end do;
end do;
fclose(fd);

Keme
Сообщения: 34
Зарегистрирован: Пт янв 29, 2010 2:57 pm

запись в файл

Сообщение Keme » Пн ноя 04, 2013 11:55 am

VSI, спасибо за помощь. Код рабочий, но не могу получить одинаковые результаты.
Пробую вот так. Сначала провожу вычисления, записываю результат в файл, а потом считываю из файла и строю график.

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

restart;
fd := fopen("D:\\res11.txt", WRITE);
z := x+I*y;
f := 3*z^3+11*z^2+18*z+12;
g := 12*z^4-25*z^3+35*z^2-30*z+12;
for x from -3 to 3 do
for y from -3 to 3 do
if evalf(abs(eval(f/g, z = x+I*y))) <= 1.0 then fprintf(fd, "%10.5g %10.5g \n", Re(evalc(f/g)), Im(evalc(f/g)))
end if
end do
end do;
fclose(fd);
d := fopen("D:\\res11.txt", READ);
L := readdata(fd, 2);
fclose(fd);
g1 := map((u)-> [[u[1], u[2]]], L);
plot({g1})


В результате вижу график, который не соответствует графику, полученному с помощью кода:

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

restart;
f := 3*z^3+11*z^2+18*z+12;
g := 12*z^4-25*z^3+35*z^2-30*z+12;
with(plots);
implicitplot({evalf(abs(eval(f/g, z = x+I*y))) <= 1}, x = -3 .. 3, y = -3 .. 3)


Подскажите, пожалуйста, в чем может быть разница?