Русскоязычный форум закрыт из-за отсутствия активности (доступен только для чтения).
Пожалуйста, пользуйтесь англоязычной его версией. Приносим извинения за неудобства
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Вход


Опции
К последнему сообщению К первому непрочитанному
Offline futurama81  
#1 Оставлено : 6 июня 2013 г. 19:32:07(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
если в цикле использовать подряд ф-цию random с одинаковь1м параметром, то ИНОГДА получается, что генерируется одно и то же значение (возможно, зависит от степени вложенности, у меня от 2-3-го уровня сбоит, иногда уже от 1-го). разберитесь, пожалуйста.

с ув.,
Футурама

Wanna join the discussion?! Login to your Форум проекта SMath forum account. Новые регистрации запрещены.

Offline futurama81  
#2 Оставлено : 6 июня 2013 г. 22:35:34(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
и еще одна ошибка.
с предь1дущей она связана косвенно, но проявилась она в одном с ней примере и заметна именно через нее.
если коротко, то каждое вь1ражение, включающее предь1дущие, рассчить1ваеться, начиная с самого первого КАЖДЬ1Й раз.
пример:

x:random(10)
x=9
x=0
x=1
x=7


возможно, ето не баг, а фича, но ето НЕПРАВИЛЬНО!
при программировании мне надо иметь постоянное значение х, а каждь1й раз, обращаясь к нему, я получаю что-то другое. если б ето бь1ла функция [например "x(n):random(n)"], тогда понятно, а так прокол. исправляйте.




и еще один пример той же ошибки:




y:x^2
x:2
y=4
x:3
y=9



т.е. рассчитанное значение среда воспринимает
как ФУНКЦИЮ и каждь1й раз пересчить1вает заново.
при программировании ето недопустимо. надеюсь, исправить будет несложно. удачи.
Offline mikekaganski  
#3 Оставлено : 6 июня 2013 г. 23:41:05(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Это не баг, а фича. Вы используете символьное определение, т.е. x - это не число, возвращаемое ф-цией random(10), а синоним выражения random(10). Воспользуйтесь ф-цией eval().
С уважением,
Михаил Каганский
thanks 1 пользователь поблагодарил mikekaganski за этот пост.
futurama81 оставлено 07.06.2013(UTC)
Offline mkraska  
#4 Оставлено : 6 июня 2013 г. 23:47:42(UTC)
mkraska


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 27.10.2012(UTC)
Сообщений: 73
Германия

Сказал(а) «Спасибо»: 397 раз
Поблагодарили: 45 раз в 35 постах
Вы просто попали в ловушку символьлой оптимизации. Первое начало общения с SMath для новичок: "Руки прочь от символьлой оптимизации" (правая кнопка мыши дает меню, там выберете "Оптимизация Численная" для каждого определения). Символьная оптимизация значит что присваивается выражение, численная оптимизация значит что присваивается значение выражения в моменте присваивания. Убедитесь этим динамической помощю - она покажет, что именно было присвоено, когда вводите имю переменной (х).

Всегда ожидаете неожиданное. Но никогда не ожидаете что здесь хотя кто-нибудь приказам подчиняется.
Martin Kraska

Неоффицальная портативная версия SMath с дополнениями http://smath.info/wiki/SMath%20with%20Plugins.ashx
thanks 1 пользователь поблагодарил mkraska за этот пост.
futurama81 оставлено 07.06.2013(UTC)
Offline futurama81  
#5 Оставлено : 7 июня 2013 г. 9:14:40(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
спасибо ответившим.
тем не менее, остаеться первь1й вопрос с ошибкой рандомизации. и ето уже точно не фича.
Offline mikekaganski  
#6 Оставлено : 7 июня 2013 г. 10:12:48(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Вы приложите пример ошибки, а то Ваши сообщения странные какие-то: то команды отдаёте, то хотите ответ на незаданный вопрос...
С уважением,
Михаил Каганский
Offline futurama81  
#7 Оставлено : 7 июня 2013 г. 10:29:31(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
Автор: mikekaganski Перейти к цитате
Вы приложите пример ошибки, а то Ваши сообщения странные какие-то: то команды отдаёте, то хотите ответ на незаданный вопрос...


не вопрос.
ввожу следующее:

x:line(for(j,range(1,5),el(y,j):random(100)-random(100)),y,2,1)


результат:

x=mat(0,0,0,0,0,5,1)

ошибка очевидна, так как:


random(100)-random(100)=-46


или что-то другое из диапазона приблизительно +/-100. но никак не все ноли.

Отредактировано пользователем 7 июня 2013 г. 10:32:54(UTC)  | Причина: Не указана

Offline уни  
#8 Оставлено : 7 июня 2013 г. 11:16:25(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
А так:


x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)
Россия навсегда!
Вячеслав Мезенцев
thanks 1 пользователь поблагодарил уни за этот пост.
futurama81 оставлено 07.06.2013(UTC)
Offline futurama81  
#9 Оставлено : 7 июня 2013 г. 11:25:27(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
Автор: уни Перейти к цитате
А так:


x:line(for(j;range(1;5);el(y;j):eval(random(100))-eval(random(100)));y;2;1)


да, так проблема решаеться, я уже ето понял. непонятно другое - почему каждь1й раз надо пропись1вать евал()? как по мне, маткадовский принцип куда как попроще.
и еще - почему в цикле считает так, а вне цикла - по другому. вот ето очень странно.
Offline уни  
#10 Оставлено : 7 июня 2013 г. 11:33:36(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Так получается, как уже было сказано выше, из-за того, что изначально все представления выражений в SMath Studio имеют символьную природу, т.е. random(100) - это всё равно что записать "сферический конь в вакууме". Попробуйте текстом это вписать вместо random(100) (в кавычках, без eval()), посмотрите что будет. Нужно избавляться от привычки думать, что по умолчанию происходят численные вычисления. В современных математических программах уровень вычислений должен быть на уровень выше, т.е. символьный. В SMath Studio по умолчанию идёт символьная обработка, а в частности вы можете указать делать численные вычисления. Т.е. движок SMath Studio может больше, чем обычный числовой. Поэтому его поведение кажется странным, если к этому не привыкнуть.

Ещё можно сказать, что функция random() определена только для численных вычислений. Можно попросить Андрея доопределить её поведение и для символьных (это возможно), тогда символьное решение почти не будет отличаться от числового.

Отредактировано пользователем 7 июня 2013 г. 11:37:16(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline futurama81  
#11 Оставлено : 7 июня 2013 г. 11:58:23(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
Автор: уни Перейти к цитате
Так получается, как уже было сказано выше, из-за того, что изначально все представления выражений в SMath Studio имеют символьную природу, т.е. random(100) - это всё равно что записать "сферический конь в вакууме". Попробуйте текстом это вписать вместо random(100) (в кавычках, без eval()), посмотрите что будет. Нужно избавляться от привычки думать, что по умолчанию происходят численные вычисления. В современных математических программах уровень вычислений должен быть на уровень выше, т.е. символьный. В SMath Studio по умолчанию идёт символьная обработка, а в частности вы можете указать делать численные вычисления. Т.е. движок SMath Studio может больше, чем обычный числовой.


я бь1 не бь1л так уверен, что ето плюс. в том же Маткаде можно с успехом производить символьнь1е вь1числения, но с ФУНКЦИЯМИ. здесь же всякое определение получаеться функцией по умолчанию без параметров. такой подход сильно усложняет понимание пошаговь1х вь1числений, не говоря уже о снижении скорости расчетов.

кстати, переключение на численную оптимизацию (по контекстному меню) мало на что влияет.

ну и ето никак не обьясняет почему в цикле мь1 имеем одно, а без цикла другое.

п.с. ну, ввел я random(100) (в кавычках, без eval()). текст как текст. что я должен бь1л посмотреть?
Offline уни  
#12 Оставлено : 7 июня 2013 г. 12:27:44(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Вы как любитель Mathcad'а должны были понять разницу между Mathcad'ом и SMath Studio. В Mathcad все вычисления изначально численные, поэтому такой пример в нём не заработает и возникнет ошибка вычислений. В SMath Studio это работает, можно вычитать строки, хотя в этом и мало смысла. Это говорит о том, что Mathcad ограничен изначально, он понимает только числа и только операции с числами, матрицами из чисел. Это числодробилка по типу Matlab'а. Если понадобится кроме численного вычисления вывести формулу в пакете, то тут Mathcad вскидывает лапки кверху. Кроме того, Mathcad не имеет своего символьного движка. Раньше это был встроенный и кастрированный Maple, сейчас - встроенный и кастрированный опять же MuPad.

Почему это плюс. Можно доопределить функцию random(), чтобы она работала, к примеру, с такими аргументами: random( "a".."z" ) или random( [sin(x), cos(x), tg(x)] ). При этом функция может выдавать либо произвольную букву, либо произвольно функцию из набора. Представить такое в Mathcad достаточно трудно. Есть ещё причины, почему такой подход гораздо правильнее - это пользовательские дополнения. Если нужно написать что-то своё для SMath Studio, то возможности ограничены лишь воображением и знанием математики, т.к. вы можете работать с символьным представлением выражений.

Ещё раз повторю отличие от Mathcad'а. В Mathcad все вычисления изначально численные, а символьные можно делать специально по запросу и специальному синтаксису. В SMath Studio вычисления изначально символьные, а численный результат можно получить по запросу или выбрав метод оптимизации выражения. Функции по типу random() в классическом их представлении не имеют особого смысла для символьных вычислений, поэтому эта функция не была определена для символьных расчётов. Подразумевается, что вы будете использовать её только в численном окружении, т.е. с использованием eval(). Но, повторяюсь, можно доопределить её так, что при символьных вычислениях она бы работала также как и при численных, т.е. изменив её природу на генератор символов в виде числа.

Цитата:
здесь же всякое определение получаеться функцией по умолчанию без параметров

Это не так. Всякое определение в SMath Studio - это набор символов в специальном формате и не более того. Снижение скорости расчётов - это неизбежная плата за посимвольную обработку. Что уж тут поделать, автором была выбрана такая идеология. Я думаю, что в расчёте на то, что со временем мощь компов будет такой, что это не будет большой проблемой. Если код был написан по-старинке в неуправляемом пространстве (т.е. компилировался бы в машинные коды реального процессора), то уже сейчас скорость была бы на порядок выше, но .Net съедает часть ресурсов, поэтому на сегодняшний день нельзя похвастать быстрыми расчётами. Их можно выполнить в дополнении, если уж так нужно, а SMath Studio использовать как удобный интерфейс.

П.С. По умолчанию - я имел в виду, что вообще без оптимизации подразумевается символьная обработка, т.е. изначально все вычисления символьные.

Отредактировано пользователем 7 июня 2013 г. 12:41:47(UTC)  | Причина: Не указана

Пользователь уни прикрепил следующие файлы:
SMathStudio_screen1.png
Россия навсегда!
Вячеслав Мезенцев
thanks 1 пользователь поблагодарил уни за этот пост.
genf оставлено 07.06.2013(UTC)
Offline futurama81  
#13 Оставлено : 7 июня 2013 г. 13:25:11(UTC)
futurama81

Статус: Newbie

Группы: Registered
Зарегистрирован: 06.06.2013(UTC)
Сообщений: 8
Мужчина
Украина

Сказал «Спасибо»: 3 раз
ах, вот оно что. спасибо за разьяснения.
а не будет ли ссь1лочки на лаконичную инструкцию (справочник), а то разобратся в таких тонкостях поначалу сложновато.

п.с. я-то как раз решил, что СМат - ето дробночисленная альтернатива Маткаду без лишней символьной математики, т.с. продвинуть1й калькулятор.
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.