2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 [Mathematica] Приёмы использования NMinimize
Сообщение29.04.2013, 12:15 
Аватара пользователя


13/03/13
28
Задача:
Система из 30-ти уравнений вида
Код:
q1=(x1 (k1 y1 + k2 y2 + y3))/x2 + (x2 (k2 y1 + k1 y2 + y4))/x1;
q2=(x3 (k3 y1 + k4 y2 + y3))/x4 + (x4 (k4 y1 + k3 y2 + y4))/x3;
q3=(x5 (k5 y1 + k6 y2 + y3))/x6 + (x6 (k6 y1 + k5 y2 + y4))/x5;
...
q1=q2=q3=...=q30;

С помощью Nsolve решение, к сожалению, не находится. За 10 часов 8Gb оперативной памяти заполняется и Windows требует прекратить работу Mathematica 9.
Код:
Пытаюсь подобраться к решению через
NMinimize[{Abs[
q-((x1 (k1 y1 + k2 y2 + y3))/x2 + (x2 (k2 y1 + k1 y2 + y4))/x1) - ((x3 (k3 y1 + k4 y2 + y3))/x4 + (x4 (k4 y1 + k3 y2 + y4))/x3) - ((x5 (k5 y1 + k6 y2 + y3))/x6 + (x6 (k6 y1 + k5 y2 + y4))/x5) - ...
],
   q > 0, q<1000
  }, {q, x1,...x10,y1,y2,y3,y4}, MaxIterations -> 1000000]

min в *10^-10 не удовлетворяет, нужно гораздо точнее.
По идее нужно взять какой-то диапазон q, например от 0 до 1000 и прощупать на наличие локальных минимумов. Затем уточнять каждый минимум и найти лучший.
Мне бы хватило чтоб переменные имели не отрицательные значения и NMinimize дало ноль.
Ничего толкового не выходит. Ограничения по переменным точность не повышают.
Подскажите пожалуйста алгороитм решения.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение29.04.2013, 16:32 
Аватара пользователя


13/03/13
28
И в продолжение темы.
С помощью NMinimize нашел 0 при WorkingPrecision -> 64.
Код:
{0, {q ->
   101.0420430834433774679955918968979294244029473574520859422317866,
  t320 -> 0.\
6504849089794466377860759231515659706864143918158774114636310784,
  n320 -> 1.17789,
...
qbt ->
   1.185333285349586274434892790141633463194778021826586679207542776,
  qn -> 1.22551, qbn -> 0.670329}}

Теперь подставив найденные значения переменных пробую тем же путём решить обратную задачу, оставив переменные только в 30-ом уравнении. Такая проверка.
Не решается.
То же и через NSolve:
Код:
q = 101.04204308344337746799559189689792942440294735745208594223178655\
8137078676032343905168696102786772`64.;
NSolve[{-2989.7945537284218` - 9191.25977517009` q -
    2.549227126163291` x1 - 1.722191635030272` x10 -
    3.0118338107074765` x2 - 2.1728156260717406` x3 -
    1.3502691700176936` x4 - 4.015857618531511` x5 -
    2.351936348985525` x6 - 1.3691081797123958` x7 -
    4.779638756556925` x8 - 3.293999675526374` x9 -
    3.5955428314791726` y1 - 5.529312152047978` y10 -
    4.261552216082824` y2 - 4.230455204259799` y3 -
    7.351818935320949` y4 - 2.4468608820481643` y5 -
    3.9079372796241545` y6 - 7.216540690334826` y7 -
    2.1944264954648762` y8 - 2.7915036241564106` y9 == 0,
  x1 >= 0, x2 >= 0, x3 >= 0, x4 >= 0, x5 >= 0, x6 >= 0, x7 >= 0,
  x8 >= 0, x9 >= 0, x10 >= 0, y1 >= 0, y2 >= 0, y3 >= 0, y4 >= 0,
  y5 >= 0, y6 >= 0, y7 >= 0, y8 >= 0, y9 >= 0, y10 >= 0},
{x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, y1, y2, y3, y4, y5, y6, y7,
   y8, y9, y10}, WorkingPrecision -> 64]
NSolve::ratnz: NSolve was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >>

Это что значит?
Ладно с NSolve, но почему NMinimize не удается решить?
Код:
In[1]:= q =
  101.0420430834433774679955918968979294244029473574520859422317865581\
37078676032343905168696102786772`64.;
NMinimize[{Abs[
   -2989.7945537284218` - 9191.25977517009` q -
    2.549227126163291` x1 - 1.722191635030272` x10 -
    3.0118338107074765` x2 - 2.1728156260717406` x3 -
    1.3502691700176936` x4 - 4.015857618531511` x5 -
    2.351936348985525` x6 - 1.3691081797123958` x7 -
    4.779638756556925` x8 - 3.293999675526374` x9 -
    3.5955428314791726` y1 - 5.529312152047978` y10 -
    4.261552216082824` y2 - 4.230455204259799` y3 -
    7.351818935320949` y4 - 2.4468608820481643` y5 -
    3.9079372796241545` y6 - 7.216540690334826` y7 -
    2.1944264954648762` y8 - 2.7915036241564106` y9
   ],
  x1 >= 0, x2 >= 0, x3 >= 0, x4 >= 0, x5 >= 0, x6 >= 0, x7 >= 0,
  x8 >= 0, x9 >= 0, x10 >= 0, y1 >= 0, y2 >= 0, y3 >= 0, y4 >= 0,
  y5 >= 0, y6 >= 0, y7 >= 0, y8 >= 0, y9 >= 0, y10 >= 0,
  Element[x1, Integers], Element[x2, Integers], Element[x3, Integers],
   Element[x4, Integers], Element[x5, Integers],
  Element[x6, Integers], Element[x7, Integers], Element[x8, Integers],
   Element[x9, Integers], Element[x10, Integers],
  Element[y1, Integers], Element[y2, Integers], Element[y3, Integers],
   Element[y4, Integers], Element[y5, Integers],
  Element[y6, Integers], Element[y7, Integers], Element[y8, Integers],
   Element[y9, Integers], Element[y10, Integers]
  }, {x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, y1, y2, y3, y4, y5, y6,
   y7, y8, y9, y10}]

Out[2]= {931693., {x1 -> 0, x2 -> 0, x3 -> 0, x4 -> 0, x5 -> 0,
  x6 -> 0, x7 -> 0, x8 -> 0, x9 -> 0, x10 -> 0, y1 -> 0, y2 -> 0,
  y3 -> 0, y4 -> 0, y5 -> 0, y6 -> 0, y7 -> 0, y8 -> 0, y9 -> 0,
  y10 -> 0}}

Должен быть ноль, а тут почти миллион!

-- 29.04.2013, 14:50 --

По приведенному в самом верху примеру.
Mathematica нашла все переменные x и y. Я их подставил в систему и попытался получить значения коэффициентов К1,К2... в последнем уравнении.
Должен бы получиться 0 при WorkingPrecision -> 64 и точные значения К - а это натуральные числа.
Нет.
Где я ошибаюсь? Я разве не логично рассуждаю?

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение30.04.2013, 13:38 
Аватара пользователя


13/03/13
28
Уже понял, всем спасибо.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение30.04.2013, 19:20 
Аватара пользователя


15/01/06
200
Я прошу прощения, но в предыдущей теме, где мы обсуждали возможность нахождения решения, я неправильно привел пример минимизируемой функции. Думал про одно, написал другое. Надо не модуль суммы всех уравнений брать, а сумму модулей левых частей минимизировать.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение01.05.2013, 14:45 
Аватара пользователя


13/03/13
28
Приятно было дойти своими мозгами. :-)
Объясните, пожалуйста, если NMinimize даёт ноль, при определенной точности, то почему NSolve не решает туже задачу? (может и решает, но я ни разу не дожидался)
Или это какой-то условный ноль?
Или NSolve стремиться найти всё множество решений и потому процесс вычислений затягивается?
Я же могу тогда ограничить расчёт в ожидаемой зоне, например $q>101, $q<102 ?
И получить точное решение.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение01.05.2013, 16:25 
Аватара пользователя


15/01/06
200
Нет, если NMinimize сказал, что в минимуме ноль, значит там самый настоящий ноль :D У NMinimize так сказать "ответственности" перед вами меньше, поэтому он и вычисляет быстрее, ведь его дело маленькое - найти минимум, он грубо говоря, что насчитает за отведенное ему число итераций, то и выдаст. NSolve же просто обязан выдать решение и причем не одно, а все. Да и сама логика у этих методов разная. Кроме NSolve можно еще попробовать FindRoot, он тоже ищет решение, но только одно, правда насколько я помню, в нем нельзя задать ограничение неравенствами. В вашем случае я не уверен, что при каких-то определенных ограничениях NSolve таки разродится решением. Если вам нужны все решения, то можно попытаться "выжать" их из NMinimize, например, после каждой минимизации к ограничениям добавлять условие неравенства переменных всем предыдущим полученным точкам минимума. Хотя не факт, с такими ограничениями он будет переходить к следующему минимуму, а не выдавать за минимум какую-то очень близкую к предыдущему минимуму точку.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение03.05.2013, 10:16 
Аватара пользователя


13/03/13
28
FindRoot отказывается работать, если количество переменных превышает количество уравнений в системе.
Цитата:
он и вычисляет быстрее, ведь его дело маленькое - найти минимум

Ох и муторное это дело! Каждый обсчёт длиться часами. Мне бы хоть одно решение получить!
Коллега DLL в первой теме советовал воспользоваться базисами Грёбнера.
Mathematica увеет их вычислять. Тоже, правда, замучаешься ждать результата.
Уважаемый Leierkastenmann, можно этим как-то грамотно воспользоваться в моём случае? Уж больно у меня задача громоздкая.

 Профиль  
                  
 
 Re: [Mathematica] Приёмы использования NMinimize
Сообщение03.05.2013, 11:34 
Аватара пользователя


15/01/06
200
altestudent, насчет базисов Грёбнера ничего не скажу, это лучше спросите у DLL, раз уж это он советовал их использовать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: YandexBot [bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group