ODE и программирование

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

Модератор: Admin

Chernykh_IL
Сообщения: 60
Зарегистрирован: Чт фев 02, 2006 11:55 am

ODE и программирование

Сообщение Chernykh_IL » Вт дек 04, 2012 6:49 am

Решаю задачу по моделированию выпрямителя. Моделирую диод нелинейной функцией ("маленькое" сопротивление в при положительном токе и "большое" сопротивление при отрицательном токе). Столкнулся с тем, что если эту нелинейную функцию выполнить на основе функции if или с помощью программы (составного оператора из нескольких строк), то задача не решается. Ошибка: "значение должно быть скалярным".
Однако, если ту же функцию выполнить на основе встроенной функции Хевисайда (равно как и на основе sign), то все работает, и диаграммы соответствуют реальности (дополнительно проверено в OrCad).
Признаться, в описании пакета не находил такого ограничения, или я что-то делаю неверно.
Прилагаю файл сделанный в Mathcad 14.
Спасибо.

P.S. Ну, да... Я "в курсе", что Simulink и еще куча программ решат эту задачу "в легкую", но мы ведь Mathcad обсуждаем...

VFO
Сообщения: 4227
Зарегистрирован: Ср фев 27, 2002 8:03 pm

Re: ODE и программирование

Сообщение VFO » Ср дек 05, 2012 4:49 pm

Chernykh_IL писал(а):Решаю задачу по моделированию выпрямителя. Моделирую диод нелинейной функцией ("маленькое" сопротивление в при положительном токе и "большое" сопротивление при отрицательном токе). Столкнулся с тем, что если эту нелинейную функцию выполнить на основе функции if или с помощью программы (составного оператора из нескольких строк), то задача не решается. Ошибка: "значение должно быть скалярным".
Однако, если ту же функцию выполнить на основе встроенной функции Хевисайда (равно как и на основе sign), то все работает, и диаграммы соответствуют реальности (дополнительно проверено в OrCad).
Признаться, в описании пакета не находил такого ограничения, или я что-то делаю неверно.
Прилагаю файл сделанный в Mathcad 14.
Спасибо.

P.S. Ну, да... Я "в курсе", что Simulink и еще куча программ решат эту задачу "в легкую", но мы ведь Mathcad обсуждаем...

Интересное решение! Спасибо.
Эту задачу лучше решать в среде Mathcad Prime.
Почему!?
Там функция odesolve (а почему вы с ней не работаете?) работает с if и с единицами измерения.
См. пример - http://communities.ptc.com/message/188012

Решение будет намного элегантней!
Давайте попробуем?

Chernykh_IL
Сообщения: 60
Зарегистрирован: Чт фев 02, 2006 11:55 am

Сообщение Chernykh_IL » Чт дек 06, 2012 7:09 am

Пробовал пару раз Odesolve - те мои задчи, что rkfixed "брал" без проблем odesolve "не смог" взять. Попробую снова... Mathcad Prime... Он уже полностью "перекрыл" возможности "старого" Mathcad'а ?
Спасибо.

VFO
Сообщения: 4227
Зарегистрирован: Ср фев 27, 2002 8:03 pm

Сообщение VFO » Чт дек 06, 2012 7:56 am

Chernykh_IL писал(а):Пробовал пару раз Odesolve - те мои задчи, что rkfixed "брал" без проблем odesolve "не смог" взять. Попробую снова... Mathcad Prime... Он уже полностью "перекрыл" возможности "старого" Mathcad'а ?
Спасибо.

См
http://communities.ptc.com/polls/1134
и
http://communities.ptc.com/polls/1141

Но то, что odesolve теперь работает с физическими величинами - это уникальное свойство, которого нет у других программ!
Только из-за этого стоит поставить на свой компьютер Prime (и оставить Mathcad 15!).

Korobov V I
Сообщения: 1609
Зарегистрирован: Вт янв 21, 2003 5:12 pm

Re: ODE и программирование

Сообщение Korobov V I » Чт дек 06, 2012 2:40 pm

Chernykh_IL писал(а): Столкнулся с тем, что если эту нелинейную функцию выполнить на основе функции if или с помощью программы (составного оператора из нескольких строк), то задача не решается. Ошибка: "значение должно быть скалярным".
Однако, если ту же функцию выполнить на основе встроенной функции Хевисайда (равно как и на основе sign), то все работает...

Должен Вас разочаровать. Функция, сформированная через if, работает. Вы просто неверно к ней обращаетесь.
См. рис.
Изображение

Chernykh_IL
Сообщения: 60
Зарегистрирован: Чт фев 02, 2006 11:55 am

Сообщение Chernykh_IL » Пт дек 07, 2012 10:52 am

Должен Вас разочаровать.

Так наоборот - воодушевили. Буду обращаться правильно.

Chernykh_IL
Сообщения: 60
Зарегистрирован: Чт фев 02, 2006 11:55 am

Сообщение Chernykh_IL » Пт дек 07, 2012 7:19 pm

Да, если поставить индекс "0" при переменной "х", работает. Работает и с использованием программы (ура!). Непонятно только, почему же его нужно указывать? В данном конкретном случае D(t,x) ведь не векторная функция. Прошу пояснить.
Спасибо.
P.S. Перестает работать формула для вычисления производной тока (d_tok:= .....).

Chernykh_IL
Сообщения: 60
Зарегистрирован: Чт фев 02, 2006 11:55 am

Сообщение Chernykh_IL » Пн дек 10, 2012 7:35 am

Коллеги, помогите разобраться.
В чем разница применения функции, созданной на основе программы (Функция-2) и функции, созданной на основе функции Хевисайда (Функция-1):

1. Почему для Функции-2 необходимо указывать индекс 0 для переменной х (Формула-2), а при использовании Функции-1 это не требуется (Формула-1)?

2. Почему в случае использования Функции-2 и Формулы-2 перестают работать выражения для вычисления производных через функцию D(t,x) - Выражения 1 и 3.
При этом работают Выражения 2 и 4. Но там используется та же самая функция D(t,x), только записанная заново.
В случае же использования Функции-1 и Формулы-1 все выражения (1-4) работают, как по-моему и должно быть.

Соответствующие файлы прилагаю.

Спасибо.