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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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