Задачки для тренировки мозгов так или иначе связанные с торговлей. Теорвер, теория игр и пр. - страница 22

 
new-rena:
Нормально поддается. Я же выложил код уже. Сейчас подшаманю до правильного ответа и всё

Поделишься резалтом?... :-)
 
new-rena:
Интересно - как это выглядит - не синусоида по геометрической прогрессии?
 
avtomat:

Ну очень прилично. Т.е. мы говорим, что каждый последующий шаг-открытие лота через шаг в пипсах всё ближе и ближе к развороту тренда, поэтому сильнее увеличивать уже размер ордера не будем, но откроем на всякий случай, вдруг что то не так)))
 

Ренат, так тебе что нужно - решить уравнение или что-то еще?

Если уравнение

MiniLot^(x^0)+MiniLot^(x^1)+MiniLot^(x^2) ... + MiniLot^(x^(N-1))=VolMax

надо решить относительно х, то это проще пареной репы - методом Ньютона или секущих. Но нужно задать MiniLot, VolMax и N.

 
new-rena:
Ну очень прилично. Т.е. мы говорим, что каждый последующий шаг-открытие лота через шаг в пипсах всё ближе и ближе к развороту тренда, поэтому сильнее увеличивать уже размер ордера не будем, но откроем на всякий случай, вдруг что то не так)))

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

Да и у меня на сей счёт свои соображения имеются.

 
Mathemat:
Ренат, так тебе что нужно - решить уравнение или что-то еще?

Теперь хочу написать его решение в виде формулы. Уже вывожу формулу.

Спасибо большое

 
new-rena: Теперь хочу написать его решение в виде формулы. Уже вывожу формулу.
Формулу не выведешь, моск рака заработаешь. А функцию, решающую его приближенно, написать можно. Но это если надо решать относительно х, конечно.
 
Mathemat:
Формулу не выведешь, моск рака заработаешь. А функцию, решающую его приближенно, написать можно. Но это если надо решать относительно х, конечно.
Сделал, тока действительно функцию
 
new-rena: Сделал, тока действительно функцию

Покажи.

P.S. Мой моск отказывается решать такую странную, инопланетную задачу. Монотонность первой производной не соблюдается. А это мешает легко и просто решить уравнение по х методом секущих/Ньютона. Хотя тупым перебором (сильно оптимизированным) она решается, причем довольно быстро.

Вот если б там было не возведение в двухэтажную степень, а просто умножение, все было бы легче и понятнее.

Вот, тупейший алгоритм. Впрочем, считает быстро. Для достижения точности 10^(-8) достаточно в районе 50 итераций.

Для начала - картинка avtomat'a с предыдущей страницы.

А теперь - моя (параметры те же):

И код:

#property show_inputs

extern double _MiniLot = 0.01;
extern double _N = 77;
extern double _VolMax = 5.96;
extern double _err = 0.0000000001;
extern double _parts = 7;


double resolve( double err, int& count )
{
   double currErr = 10;
   double xLeft = 0.00000001;
   double xRight;
   double valLeft, valRight;
   double step = _VolMax / _parts;
   count = 0;
   while( step > err )
   {
      count ++;
      xRight = xLeft + step;
      valLeft = funct( xLeft );
      valRight = funct( xRight );
      if( valLeft * valRight > 0 )     
      { 
         xLeft += step; 
         continue; 
      }
      else                             step /= _parts;
   }
   return( xLeft );
}//+------------------------------------------------------------------+


      double funct( double x )
      {
         double sum = 0;
         for( int i = 0; i < _N; i ++ )
         {
            double xPowered = MathPow( x, i );
            sum += MathPow( _MiniLot, xPowered );
         }   
         return( sum - _VolMax );
      }//+------------------------------------------------------------------+




int start( )
{
   int st = GetTickCount( );
   int count;
   double x = resolve( _err, count );
   double gone = ( GetTickCount( ) - st ) / 1000.;
   Print( "Root is x = " + x + "; funct is f = " + funct( x ) + "; gone " + gone + " sec.; count = " + count  + " steps");
   return( 0 );
}//+------------------------------------------------------------------+

P.S. Неплохо бы помнить, что этот алгоритм работает только для этой функции. Она монотонна и, следовательно, имеет единственный корень. К сожалению, немонотонность первой производной не позволяет применить метод касательных. Правда, проигрыш совсем не чувствуется: время вычислений, взятое с помощью GetTickCount(), даже не засекается.

 

тут к решению есть ещё вот такой довесок

это для полноты картинки ;))