Ru-Board.club
← Вернуться в раздел «Программы»

» Mathematica (математика)

Автор: popkov
Дата сообщения: 13.02.2011 13:03
r_green

Цитата:
Всё, что я предложил - это рассматривать Times[] как модель математической операции умножения. Вряд ли это можно назвать отступлением от общей логики математического пакета вообще, а не только Mathematica...

А как отделить те функции, которые следует рассматривать как модели математических операций от тех, которые надо рассматривать именно как функции, специфические для данной среды программирования?

Например, ранее обсуждавшиеся операции Equal и SameQ. Как минимум первая из них - явно ассоциируется с математической операцией равенства. Однако это "равенство" на деле игнорирует последние 7 цифр битового представления числа! Так можно ли утверждать, что функция Equal является моделью математической операции равенства?!

Хорошо, что в справке к Equal это хотя бы упомянуто. А в справках к Greater и Less - даже не упоминается, хотя действут та же "фича"!

Ну и где здесь единая логика?! Как пользователь должен выбирать функции, если их названия лгут, и даже в справке к ним зачастую нельзя найти важнейших их "особенностей", несовместимых с их простым математическим предназначением?

Добавлено:
Откровенно говоря, я вообще не понимаю, с какого черта разработчики решили отбрасывать последние 7 цифр битового представления числа. Почему не 8? Почему не 2? Даже эта, полудокументированная особенность, "подвешивает" пользователя. Хотя я и видел в документации это замечание раньше, я пропускал его "мимо ушей" из-за очевидной абсурдности и полной неочевидности мотивации такого поведения примитивнейших и фундаментальнейших (казалось бы!) функций.

Предположим, я захотел написать функцию, которая будет сравнивать все цифры битового представления числа. Оказывается, эта элементарнейшая задача в Mathematica требует привлечения таких сложных функций, как RealDigits или SetPrecision. И только путем проб и ошибок можно обнаружить, что реализовать полноценную операцию равенства, по-видимому, можно с помощью функций Min и Max, которые по счастливой случайности не отбрасывают последние 7 цифр двоичного представления числа (что в справке не отражено). Однако по самой очевидной логике эти функции должны быть сложнее, чем операция Equal, а последняя - фундаментальнее, чем предыдущие! На деле же для реализации примитивнейшей функции проверки равенства двух чисел своими силами (удивительно, но среди встроенных функций ее нет!) надо прибегать к более сложным функциям! Где здесь логика?!
Автор: karl_karlsson
Дата сообщения: 13.02.2011 14:47
popkov

Цитата:
Например, ранее обсуждавшиеся операции Equal и SameQ. Как минимум первая из них - явно ассоциируется с математической операцией равенства. Однако это "равенство" на деле игнорирует последние 7 цифр битового представления числа! Так можно ли утверждать, что функция Equal является моделью математической операции равенства?!

В точности то что писал выше. Надо иметь Equal абсолютный алгебраический и Equal численный. Это является Equal численный. Отличатся будут они множеством аргументов над которое они оперируют и реализацией.


Цитата:
Ну и где здесь единая логика?! Как пользователь должен выбирать функции, если их названия лгут, и даже в справке к ним зачастую нельзя найти важнейших их "особенностей", несовместимых с их простым математическим предназначением?

Конечно логики нету. Если абсолютные алгебраические операции символьным переменным и те же операции, численных переменных совместить в одно, то такое и получается.


Цитата:
Откровенно говоря, я вообще не понимаю, с какого черта разработчики решили отбрасывать последние 7 цифр битового представления числа. Почему не 8? Почему не 2?

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


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

Это уже машинно специфическое программирование, отладка и т.д. На графических калькуляторах, например, такое сделать нельзя, потому что внутренним представлением увидеть извне нельзя. Так и надо быт ввиду его машинной специфики.


Цитата:
И только путем проб и ошибок можно обнаружить, что реализовать полноценную операцию равенства, по-видимому, можно с помощью функций Min и Max, которые по счастливой случайности не отбрасывают последние 7 цифр двоичного представления числа (что в справке не отражено).

У них вполне возможно имеется нерегулярное поведение. Что то отличающееся абсолютных алгебраических операции. Аккумуляция ошибок, округление и т.д.
Автор: popkov
Дата сообщения: 13.02.2011 16:39
karl_karlsson
Цитата:
У них вполне возможно имеется нерегулярное поведение. Что то отличающееся абсолютных алгебраических операции. Аккумуляция ошибок, округление и т.д.

Да какое может быть округление, если речь идет о двоичном представлении числа?! Функция сравнения битовых последовательностей встроена в процессор, здесь "измудряться" некуда!

Откровенно говоря, этот последний пост - асолютно деструктивен! Вместо анализа причин и следствий у вас один ответ: "на все воля Божья" (точнее, воля разработчиков)! Остается только добавить: "Неисповедимы пути Господни" и закрывать эту тему нафиг, как и вообще любую науку, отличную от богословия! Прямо противно становится, ей богу!

Добавлено:
r_green

Цитата:
Всё, что я предложил - это рассматривать Times[] как модель математической операции умножения.

Какое отношение к математической операции умножения может иметь следующее поведение:

In[1]:= 0*{}

Out[1]= {}

In[2]:= 0*a

Out[2]= 0

In[3]:= a = {}; 0*a

Out[3]= {}

Явно, что здесь дело вовсе не в том, что разработчики стремились максимально приблизить некоторые функции к моделям математических операций. Но тогда остается по-прежнему непонятным вот это:

In[1]:=
0 * "some string"

Out[1]=
0
Автор: karl_karlsson
Дата сообщения: 13.02.2011 17:41
popkov

Цитата:
Да какое может быть округление, если речь идет о двоичном представлении числа?! Функция сравнения битовых последовательностей встроена в процессор, здесь "измудряться" некуда!

У этих чисел есть свое происхождение, какие то вычисления.
Вот где вычислительная алгебра отличается абсолютной - число абсолют, его представление варианта (не скажу так ли в точности терминология, но что то такое). Результата абсолютного вычисления не зависит ни от чем, например получается pi, вот pi, символ pi. Вот уже численным способом получается представление pi, которое является варианта параметров вычислительного процесса.
Сравнять двух абсолютных pi всегда дает один и тот же результат, так как абсолютное pi только одним и является. Оно всегда самим собой и равняется.
А вот сравнять двух его представлении вполне возможно, так как они могут и отличатся.

Даже точное двоичное представление вырождено:
1 = 1,0000000(0)
1 = 0,1111111(1)
Если сделать переход к численное двоичное представление
1,0000000(random)
0,1111111(random)
вырождение снимается и они уже отличаются. Так, округление является неотъемлемого свойства всякого представления.


Цитата:
Вместо анализа причин и следствий у вас один ответ: "на все воля Божья" (точнее, воля разработчиков)!

Значит, фундаментальная причина состоится в том, что абсолютные объекты алгебры в природе не существуют. Другими словами все их точные представления бесконечны и вырождены.
Также не существует какое то привилегированное естественное представление. Поэтому у разработчиков есть свобода выбора. Вот, его документация совсем другое дело.


Цитата:
Остается только добавить: "Неисповедимы пути Господни"

Ну, к сожалению, состояние дел в многих областей теории чисел такое и является на самом деле на сегодня.


Цитата:
и закрывать эту тему нафиг, как и вообще любую науку, отличную от богословия!

Значит код Mathematica закрытым и является, также и микрокод процессоров, как и самое их устройство. Реверсинг тоже наука, но уже выходить за рамки использования, как и написал отладка и т.д.


Цитата:
Прямо противно становится, ей богу!

Ну не поняли что имел ввиду. Русский у меня не очень...

Добавлено:

Цитата:

Код: In[1]:= 0*{}
Out[1]= {}
In[2]:= 0*a
Out[2]= 0
In[3]:= a = {}; 0*a
Out[3]= {}
Автор: popkov
Дата сообщения: 13.02.2011 19:47
karl_karlsson
Цитата:
Даже точное двоичное представление вырождено:
1 = 1,0000000(0)
1 = 0,1111111(1)
Ну вообще-то второе число - лишь бесконечно близко к единице, но всегда заведомо меньше ее. Впрочем, я не специалист в области теории чисел, так что вопрос, равны ли бесконечно близкие величины в ней, не стану трогать. В системах компьютерной математики они равны быть не могут, поэтому и вопрос о "вырождении" снимается: всегда можно сказать, какое число больше, какое меньше!
Цитата:
Значит, фундаментальная причина состоится в том, что абсолютные объекты алгебры в природе не существуют. Другими словами все их точные представления бесконечны и вырождены.
Первый вариант представления единицы стал "бесконечным" только благодаря вашему желанию. Бесконечная дробь - это сумма бесконечного ряда рациональных чисел, каждое из которых является отношением двух натуральных чисел, каждое из которых, в свою очередь, имеет однозначное и невырожденное представление в математике! Иначе вся математика превратилась бы в муть, и не только не приводила бы ум в порядок (как говорил Ломоносов), но лишала бы всякой ясности ума!

Цитата:
Также не существует какое то привилегированное естественное представление. Поэтому у разработчиков есть свобода выбора.

Никакой свободы выбора в случае двух вариантов представления единицы не вижу: если она и есть в чистой математике, то в машинной математике в данном случае все однозначно! Не надо мутить воду!

Цитата:
Ну, к сожалению, состояние дел в многих областей теории чисел такое и является на самом деле на сегодня.
Это весьма прискорбно. Похоже, вы слишком глубоко углубились в свою область, где нет ясности. В результате утратили и ясность собственного мышления. Сразу вспоминается мой знакомый, который после окончания мехмата МГУ (с красным дипломом) признался, что не может вспомнить, как решается квадратное уравнение...
Автор: karl_karlsson
Дата сообщения: 13.02.2011 20:47
popkov

Цитата:
Ну вообще-то второе число - лишь бесконечно близко к единице, но всегда заведомо меньше ее. Впрочем, я не специалист в области теории чисел, так что вопрос, равны ли бесконечно близкие величины в ней, не стану трогать. В системах компьютерной математики они равны быть не могут, поэтому и вопрос о "вырождении" снимается: всегда можно сказать, какое число больше, какое меньше!

Это аналог десятичного:

Цитата:
3/3 = 0,9999999(9)
3/3 = 1,0000000(0)

Фихтенгольц Г. М. Курс дифференциального и интегрального исчисления, Том 1, §2, n9
В системах компьютерной математики они уравняются округлением. Для снятия вырождения оно и существует. Есть ли такое у Mathematica? - ну код закрытым является...


Цитата:
Первый вариант представления единицы стал "бесконечным" только благодаря вашему желанию.

Ну представления всех рациональных чисел всегда конечны. Так говорить теория информации.
1 = 1,(0)
1 = 0,(1)
Оба представления конечны. Бесконечные представления имеют только иррациональные числа.


Цитата:
Бесконечная дробь - это сумма бесконечного ряда рациональных чисел, каждое из которых является отношением двух натуральных чисел, каждое из которых, в свою очередь, имеет однозначное и невырожденное представление в математике! Иначе вся математика превратилась бы в муть, и не только не приводила бы ум в порядок (как говорил Ломоносов), но лишала бы всякой ясности ума!

Это абсолютная алгебра. У численною уже бесконечности нет, потому что у них численных представлении нет.


Цитата:
Никакой свободы выбора в случае двух вариантов представления единицы не вижу: если она и есть в чистой математике, то в машинной математике в данном случае все однозначно! Не надо мутить воду!

Не это имел ввиду. А вот, у них выбор этих 7 двоичных знаков, для которых речь шла выше.
(Второе представление единицы "не существует численным образом", так как "не существуют численным образом и иррациональные числа".)
Неоднозначное численное представление имеется у рациональных чисел, а вот у рациональных оно бесконечное. Вот где отличия численной и абсолютной математики - подумайте как будете представлять pi. Только через какое то конечное выражение определяющее его. И если у вас двух таких выражении как будете их сравнивать численным образом? Вычисляете.
Если у одного выражения большая численная ошибка (ну алгоритмы), то поэтому и этих 7 знаков отбрасывают... Сравнивать их - отладка алгоритмов уже.


Цитата:
Это весьма прискорбно. Похоже, вы слишком глубоко углубились в свою область, где нет ясности. В результате утратили и ясность собственного мышления. Сразу вспоминается мой знакомый, который после окончания мехмата МГУ (с красным дипломом) признался, что не может вспомнить, как решается квадратное уравнение...

Нет, я во общем и не математик.
Проблема в том, что Mathematica слишком большая, делают ее много люди. Видения дел у них самые разные...
Автор: popkov
Дата сообщения: 13.02.2011 21:05
karl_karlsson
Вы все усложняете. Я не вижу ни малейших оснований препятствовать тому, чтобы два (уже готовых, записанных в двоичном виде и значащих именно то, что написано, без "видений") числа пользователь не мог сравнить простейшей встроенной функцией, как это делается во всех нормальных языках программирования. Вопрос, как получены эти числа, роли не играет никакой.

Добавлено:
r_green

Цитата:
[no]MyEqual[a_, b_] := SetPrecision[a, Precision[a] + 3] == SetPrecision[b, Precision[b] + 3] [/no]

Только что было предложено более красивое решение:

MyEqual[x_, y_] := Order[x, y] == 0

Эта функция позволяет проверить равенство двух чисел, не отбрасывая последние 7 цифр двоичного представления!
Автор: karl_karlsson
Дата сообщения: 13.02.2011 21:43
popkov

Цитата:
Вы все усложняете.

Так и есть на самом деле, это самая большая проблема у меня насчет математики.


Цитата:
Я не вижу ни малейших оснований препятствовать тому, чтобы два (уже готовых, записанных в двоичном виде и значащих именно то, что написано, без "видений") числа пользователь не мог сравнить простейшей встроенной функцией, как это делается во всех нормальных языках программирования. Вопрос, как получены эти числа, роли не играет никакой.

Это действительно так.
Думаю, надо было Mathematica помечала каким то образом то что сама вычисляла и то что ее предоставлено извне. Это физическим образом представлении величин - значение +/- ошибка исчислении.
И чтобы была команда менять значении ошибок.
Автор: TomasVercetti
Дата сообщения: 16.02.2011 12:55
Кто-нибудь занимался приобретением Mathematica (для организации)? А то я им в wolfram и e-mail отправлял, и с сайта форму — молчат как партизаны!
Автор: popkov
Дата сообщения: 16.02.2011 15:08
Очень грустный глюк NIntegrate 7-ки:

In[15]:= NIntegrate[Sin[x^2], {x, -5, -2}]

Out[15]= 0.276859

In[1]:= N[Integrate[Sin[x^2], {x, -5, -2}]]

Out[1]= -0.276859

В 5-ке все в порядке. В 8-ке исправили, но что-то уж слишком печально все это...

Добавлено:
Любопытно, кстати, что при отключении symbolic preprocessing все становится как надо:

In[15]:= f[x_?NumericQ] := Sin[x^2]
NIntegrate[f[x], {x, -5, -2}]


Out[16]= -0.276859

In[6]:= NIntegrate[Sin[x^2], {x, -5, -2},
Method -> {"SymbolicPreprocessing", "SymbolicProcessing" -> 0}]

Out[6]= -0.276859
Автор: Andrew10
Дата сообщения: 16.02.2011 15:28
TomasVercetti


Цитата:
Кто-нибудь занимался приобретением Mathematica (для организации)? А то я им в wolfram и e-mail отправлял, и с сайта форму — молчат как партизаны!


Нужно писать в Softline:
http://soft.softline.ru

Мы покупали через эту фирму.
Автор: TomasVercetti
Дата сообщения: 16.02.2011 16:29
Andrew10,

Спасибо, написал им. Как быстро они обычно отвечают?
Автор: vikkiv
Дата сообщения: 16.02.2011 16:46
TomasVercetti

Если до десяти лицензий то смысла запросов прайс-листа - нет,
на организацию лицензия покупается так-же как и для домашнего пользования - через их веб-магазин на сайте (скачать или получить диск / электронный инвойс),
store.wolfram.com/catalog/
(выбрав страну / у лицензии есть ограничения по стране приобритения/пользования, хотя если например научный/торговый агент ездит по странам в командировки - наверное у них уточнять надо)

просто выбрать надо не "домашную версию" , а обычную
(ещё есть прайсы для образовательных учереждений и для гос-организаций)
На "soft.softline.ru" казалось-бы дороговато, но эта та-же цена что и на "wolfram.com" просто ещё плюсом идёт 18% НДС (если скачваете то под таможенный режим ничего не попадает, следовательно таможенных сборов/пошлин нет)


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

(Ответ: нет , для приобритения на компанию не занимался)
Автор: TomasVercetti
Дата сообщения: 16.02.2011 17:22
vikkiv,

Спасибо — интересная информация к размышлению. Приобретаться будет (если будет) более 10 точно; для университета. Проблема в том, что, по информации с офиц. сайта, поддержка количества ядер на компьютере, возможность организации кластера — это всё отдельные плюшки за отдельные деньги, цену же предлагают узнавать в индивидуальном порядке.
Автор: Andrew10
Дата сообщения: 16.02.2011 21:18
TomasVercetti
Если для университета, то обязательно нужно покупать академическую лицензию, это дает существенные скидки, хотя и дополнительная морока с оформлением покупки. В частности, мы подписывали у ректора гарантию, что условия пользования лицензией будут строго соблюдаться, а также посылали копии документов, что Вуз официально аккредитован, сейчас точно не помню какие. Но если написать в SoftLine, то они все объяснят, и даже потом долго будут еще слать всякие рекламы и предложения по почте про обновления а также и про другие программные продукты.
Автор: TomasVercetti
Дата сообщения: 22.02.2011 21:13
Спасибо всем за помощь — дело в производстве! Кстати, сказали, что "8.0.1 coming soon".

Попутно возник теоретический вопрос — погуглил, но ответа не нашёл.Предположим, хочу ввести запись в виде 1.5e10. Есть предопределённые инфиксные операторы, на которые можео навесить функционал, например, A\[CirclePlus]B. Можно ли произвольный символ (e) так опредлить? (Просто на e нужное правило навесить можно с помощью Notation InfixNotation, но необходимо писать «1.5e 10» — с пробелом после e.) Либо, другой вариант, назначить (input)box'ам, удовлетворяющим шаблону типа _Number e _Number, соответствующее правило. Есть у кого-нибудь идеи, как это можно сделать? Спасибо.

P.S.: С 23-м!
Автор: popkov
Дата сообщения: 23.02.2011 15:04
TomasVercetti

Цитата:
Есть предопределённые инфиксные операторы, на которые можео навесить функционал, например, A\[CirclePlus]B. Можно ли произвольный символ (e) так опредлить?

Сам символ, наверное, нельзя, но его аналог из Unicode, выглядящий похоже, возможно, все же можно. Думая над вашим вопросом, я обнаружил очень интересный файлик \SystemFiles\FrontEnd\TextResources\UnicodeCharacters.tr, в котором, судя по его виду, определяются функции юникодовых символов, включая и \[CirclePlus]. Сейчас попробую поиграть с ним.

Добавлено:
Поиграл, но результаты отрицательные. Разве что разработчики могут подсказать какую-то хитрость.
Автор: r_green
Дата сообщения: 23.02.2011 19:24
TomasVercetti

Цитата:
Попутно возник теоретический вопрос — погуглил, но ответа не нашёл.Предположим, хочу ввести запись в виде 1.5e10.



Код:
In[1]:= MakeExpression[
RowBox[{m_ /; NumberQ[ToExpression[m]],
e_ /; StringMatchQ[e, "e" ~~ __?(IntegerQ[ToExpression[#]] &)]}],
f_] := MakeExpression[m <> "*^" <> StringDrop[e, 1], f]

In[2]:= 1.234567e8

Out[2]= 1.23457*10^8
Автор: TomasVercetti
Дата сообщения: 24.02.2011 22:25
popkov, r_green — спасибо! Буду разбираться. На самом деле, в 8ке само по себе число рассчитывается правильно, но 5*1.234567e8 или 1.234567e8*5 уже нет.
Автор: popkov
Дата сообщения: 25.02.2011 06:53

Цитата:
в 8ке само по себе число рассчитывается правильно, но 5*1.234567e8 или 1.234567e8*5 уже нет.

В 7.01 то же самое, но если поставить скобки, то работает:

In[4]:= 5*(1.234567 e8)

Out[4]= 6.17284*10^8
Автор: r_green
Дата сообщения: 25.02.2011 12:21
TomasVercetti

Цитата:
само по себе число рассчитывается правильно, но 5*1.234567e8 или 1.234567e8*5 уже нет.


Вот более проработанный вариант:

Код:
In[1]:= MakeExpression[x : RowBox[{___, _RowBox, ___}], f_] :=
MakeExpression[Level[#, {-1}] & /@ x, f]


In[2]:= MakeExpression[
RowBox[{afx___, m_ /; NumberQ[ToExpression[m]], "e", "-",
e_?(IntegerQ[ToExpression[#]] &), pfx___}], f_] :=
MakeExpression[RowBox[{afx, m <> "*^-" <> e, pfx}], f]

In[3]:= MakeExpression[
RowBox[{afx___, m_ /; NumberQ[ToExpression[m]],
e_ /; StringMatchQ[e, "e" ~~ __?(IntegerQ[ToExpression[#]] &)],
pfx___}], f_] :=
MakeExpression[RowBox[{afx, m <> "*^" <> StringDrop[e, 1], pfx}], f]

In[4]:= 5*1.234567e8

Out[4]= 6.17284*10^8

In[5]:= 1.234567e8*5

Out[5]= 6.17284*10^8

In[6]:= 5*1.234567e8*5

Out[6]= 3.08642*10^9

In[7]:= 5*1.234567e-8*5

Out[7]=3.08642*10^-7
Автор: vikkiv
Дата сообщения: 05.03.2011 00:23
Вопрос к спецам системы, как можно проще реализовать фильтрацию таблиц по признаку одного из столбцов, т.е. имеется исходная числовая матрица "matr1" и необходимо из неё получить матрицу "matr2" элементы одного из столбцов которой содержат только определённые значения, либо значения лежащие в определённых границах (или наборе границ). В Excel просто, в SQL тоже просто, а тут в документации и продцедурах закопаешься .. третий день голову ломаю ..

Напр. из матрицы 1 получить матрицу 2 содержащую в первой колонне только значения "a" и из матрицы 1 получить матрицу 3 содержащую в третьей колонне только значения "4":
matr1>matr2
matr1>matr3

:

matr1=
a 6 5
Автор: Partner1
Дата сообщения: 05.03.2011 06:32
vikkiv
Попробуйте так.

Код:
matr1 = {{a, 6, 5}, {b, 6, 1}, {a, 3, 4}, {c, 6, 4}, {a, 8, 4}, {b, 6,
2}};

ind2 = Flatten[Position[matr1[[All, 1]], a]];

ind3 = Flatten[Position[matr1[[All, 3]], 4]];

matr2 = matr1[[ind2]];

matr3 = matr1[[ind3]];

{MatrixForm[matr2], MatrixForm[matr3]}
Автор: r_green
Дата сообщения: 05.03.2011 11:56
vikkiv

Цитата:
из матрицы 1 получить матрицу 2 содержащую в первой колонне только значения "a" и из матрицы 1 получить матрицу 3 содержащую в третьей колонне только значения "4"



Код:
In[1]:= matr1 = {{a, 6, 5}, {b, 6, 1}, {a, 3, 4}, {c, 6, 4}, {a, 8, 4}, {b, 6, 2}};

In[2]:= matr2 = Select[matr1, #[[1]] == a &]

Out[2]= {{a, 6, 5}, {a, 3, 4}, {a, 8, 4}}

In[3]:= matr3 = Select[matr1, #[[3]] == 4 &]

Out[3]= {{a, 3, 4}, {c, 6, 4}, {a, 8, 4}}
Автор: vikkiv
Дата сообщения: 05.03.2011 16:28
Partner1
r_green

Спасибо огромное, обе продцедуры работают отлично, а то раньше приходилось на SQL сервер с базой данных несколько разных запросов посылать, что значило лишний трафик и дополнительную нагрузку на общий сервер.
Теперь модель работает как часы..

Код:
In[1]:= Needs["DatabaseLink`"];
In[2]:= OpenSQLConnection[];

In[3]:= RunScheduledTask[{
SQLExecute[..,..,..];
...
Export["C:\\Inetpub\\wwwroot\\...html",..];
Export["C:\\Inetpub\\wwwroot\\....jpg",..];
}, nnn];

In[4]:= RemoveScheduledTask[ScheduledTasks[]];
In[5]:= ScheduledTasks[]
In[6]:= SQLConnections[]
Автор: Andrew10
Дата сообщения: 11.03.2011 15:38
Привет всем!
Возник вот такой вопрос: решаю численно диф. уравнение с разными параметрами, параметры устанавливаю с помощью правила подстановки, примерно так:
(простой пример гармонического осциллятора )

First[NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0}, x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]

При этом сначала выдается такое красное предупреждение
NDSolve::ndnl: Endpoint tmax in {t,0.,tmax} is not a real number. >>

а потом правильный результат интегрирования. Можно ли избавиться от этого предупреждения? При этом желательно не просто его отключить, а правильно применить подстановку, чтобы оно вообще не возникало.
Спасибо!
Автор: r_green
Дата сообщения: 11.03.2011 18:56
Andrew10

Код:
First[Hold@NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0}, x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]
Автор: Andrew10
Дата сообщения: 11.03.2011 21:26
r_green
Спасибо! Идея понятна, правда в такой форме функция First только снимает атрибут Hold, но не убирает одну пару скобок во вложенном списке, как это мне нужно. Поэтому окончательно необходимый результат получается таким образом:


Код: First@ReleaseHold[
Hold@NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0},
x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]
Автор: popkov
Дата сообщения: 12.03.2011 12:30
Andrew10
Вот более элегантное решение:
First[Unevaluated@
NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0},
x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}]
Здесь я с помощью Unevaluated одноразово защищаю от выполнения NDSolve[...], и его выполнение происходит уже после того, как замена выполнена.
Автор: Andrew10
Дата сообщения: 12.03.2011 14:09
popkov

Спасибо! Буду иметь ввиду и этот способ.

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Идея несуществующей программы...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.