1

Тема: Дайте цікаві задачі.

Кожен день заходжу по 2-3 рази на форум і крім волань про рішення дурних лабораторних нічого нема.
Може в кого ще є які цікаві задачі? Я вон відповідь про поїзд написав, але ніхто не відписав чи рішення правильне(

Подякували: Voron1

2

Re: Дайте цікаві задачі.

Vo_Vik написав:

Кожен день заходжу по 2-3 рази на форум і крім волань про рішення дурних лабораторних нічого нема.
Може в кого ще є які цікаві задачі? Я вон відповідь про поїзд написав, але ніхто не відписав чи рішення правильне(

В мене є кілька задачок, але рішення до них не маю.. бажаєте?

3

Re: Дайте цікаві задачі.

давай..те

4

Re: Дайте цікаві задачі.

Є  N кількість  червониз  та V кількість синіх бактерій. Через 1 с. проміжок часу кожна  червона бактерія народжує одну синю та одну червону бактерію. Скільки буде синіх бактерій після P часу?

5 Востаннє редагувалося HetmanNet (21.12.2012 16:03:34)

Re: Дайте цікаві задачі.

sasa написав:

Є  N кількість  червониз  та V кількість синіх бактерій. Через 1 с. проміжок часу кожна  червона бактерія народжує одну синю та одну червону бактерію. Скільки буде синіх бактерій після P часу?

Це елементарна математика:

S=V*2^P 

Не кепкуйте, це задачка для школи. Звичайна геометрична прогресія.

Маю задачу, яку колись вирішував, чесно кажучи не складна, але в реалізації має свої ускладнення, якщо використовувати стандартні бібліотеки:
Маємо два полі гармонійних сигнали напруги і струму з певною тривалістю, які квантуються (оцифровуються) з нерівним періодом дискретизації (таке зустріти фактично не реально). Ці сигнали необхідно розкласти на певну кількість гармонік та отримати спектральний аналіз потужності.
Тривалість сигналу визначається автоматично із файлу на основі часових міток. Кількість гармонік задається користувачем, і відповідно до цього визначається параметри спектрального аналізу потужності.
Потужність визначати за теорією миттєвих потужностей. Файл текстовий містить три стовпці, в першому час вказаний, в другому значення напруги, в третьому значення струму. Кількість строк невідома (бо залежить від тривалості і "частоти" дискретизації). Символом що відділяє один стовпець від іншого може бути символ табуляції чи чотири пробіли, знаком відокремлення цілих може бути крапка чи кома. Дані параметри задає користувач.

Вершиною цієї задачки є визначення еквівалентних елементів у колі, які можуть давати такий сигнал. Але для цього вже буде замало просто wikipedia та підручника з фізики чи електротехніки.
Загалом на першу частину витратив чимало часу, але з середнім рівнем ліні можна вирішити за тиждень чи місяць якщо користуватися wikipedia.

6

Re: Дайте цікаві задачі.

Так поїхали.
Чесно кажучи я трохи не в’їхав в умову, тому перепитаю.

Маємо два полі гармонійних сигнали напруги і струму з певною тривалістю

Що тут мається наувазі? є один сигнал в якому міряють напругу і струм, чи є один сигнал в якому міряють напругу, а в другому струм?

Файл текстовий містить три стовпці, в першому час вказаний, в другому значення напруги, в третьому значення струму

Виходячи з цього сигнал все ж таки один. Я правильно зрозумів?

які квантуються (оцифровуються) з нерівним періодом дискретизації (таке зустріти фактично не реально).

Причому тут оцифровка взагалі не зрозумів. Це що мається на увазі, що часові проміжки в тому файлі просто не рівні?
якщо відповіді на попередні питання "так". То все зводиться до визначення параметрів функції виду:
y=cos(k1*x+b1)+cos(k2*x+b2)+...
Де якщо в колі нема блоків затримки b=b1=b2=....
для більшої точності можна взяти сигнал по струму як косінусоїдальний, а для напруг добавити параметер a як зсув фази.
Далі вирішується методом найменших квадратів. Мова має значення?
По колу яке це генерує просто набір котушки і конденсатора для кожної косинусоїди.

7

Re: Дайте цікаві задачі.

Можна ще добавити коефіцієнти для кожного косінуса, якщо амплітуда гармонік не одинакова.

8 Востаннє редагувалося HetmanNet (21.12.2012 20:46:34)

Re: Дайте цікаві задачі.

1. Один сигнал в якому міряємо два параметри: напруга і струм.
2. Файл один
3. Не рівні проміжки між вимірами, тому тобі дано час заміру кожної точки виміру

Перед розкладанням на гармоніки необхідно зробити часові проміжки однаковими, для цього виконують інтерполяцію, тобто отримують проміжні значення. Бо розкладання на гармоніки потребує однакових проміжків.
У функції перед косинусом в тебе є значення напруги чи струму, бо амплітуда гармонік буде в будь-якому разі різна, крім того ще є синуса складова та постійна складова. Тобто в тебе функція складатиметься з суми постійної складової, синусних складових гармонік, косинусних складових гармонік. Крім того при розкладанні на гармоніки ми в самі гармоніки не вносимо зсув, його ми визначаємо опісля на основі синусної і косинусної гармоніки одного порядку однієї відносно іншої. Тобто шукаємо зсув синусної відносно косинусної, і так для кожного порядку гармонік. А потім по формулах миттєвої потужності обчислюєш значення потужності і робиш спектральний аналіз.

9

Re: Дайте цікаві задачі.

От називається просив задачу. А сам через вихідні навіть і не глянув( нічого доберусь я таки до неї)

10

Re: Дайте цікаві задачі.

а можна ще приклад вхідного файлу, бо самому влом придумувати)

11

Re: Дайте цікаві задачі.

Це так роблю закладку для себе, дома дороблю

Прихований текст
<?php
include_once('includes/LeastSquareRegression.php');

$wave = array();

for ($i=0; $i<1000; $i++  ){
    $wave[$i]['time']=$i+(rand(0,100)+0.01)/100;
    $wave[$i]['U']=(cos($i/62.83+(rand(0,100)+0.01)/100)+cos(3*$i/62.83+(rand(0,100)+0.01)/100)+cos(5*$i/62.83+(rand(0,100)+0.01)/100))>1?1:0;
}


$dataString = "";
$first = true;
$data =array();
$data_time = array();
$i=0;

foreach($wave as $point) {
    $x=$point['time'];
    $y=$point['U'];
    $dataString.=($first?"":",")."['".$x."',".$y."]";
    $first = false;
    $data[$i] = $y;
    $data_time[$i] = $x;
    $i++;
}
//set polinom rank
$k=7;
//define polinom function
function f1($x) {
  return cos($x/62.83);
}
//Clear all internal data and prepare for new calculation.
$x_Powers = array();
$xy_Powers = array();

$squares = ( $k - 1 ) * 2;

// Initialize power arrays.
for ( $index = 0; $index <= $squares; ++$index )
{
  $x_Powers[ $index ] = 0;
  $xy_Powers[ $index ] = 0;
}
//Add a data point to calculation
for($i=0;$i<count($data);$i++) {
  //$data[$i]['x'] - month # = 0,1,...,n, not month # in year, just sort# in data array
  $x=f1($data_time[$i]);
  $y=$data[$i];
  // Accumulate new data to power sums.
  for ( $index = 0; $index <= $squares; ++$index )
  {
    $x_Powers[ $index ] = $x_Powers[ $index ] + pow( $x, $index );
  
    $xy_Powers[ $index ] = $xy_Powers[ $index ] + $y * pow( $x, $index );
  }
}
//Calculate coefficients based on current data.

// Build a matrix.
// The matrix is made up of the sum of powers.  So if the number represents the power,
// the matrix will look like this for a 5th degree polynomial:
//     [ 0 1 2 3 4 ]
//     [ 1 2 3 4 5 ]
//     [ 2 3 4 5 6 ]
//     [ 3 4 5 6 7 ]
//     [ 4 5 6 7 8 ]
//
$matrix = array();
for ( $row = 0; $row < $k; ++$row )
{
  $matrix[ $row ] = array();
  for ( $column = 0; $column < $k; ++$column )
    $matrix[ $row ][ $column ] =
      $x_Powers[ $row + $column ];
}

// Create augmented matrix by adding X*Y powers.
for ( $row = 0; $row < $k; ++$row )
  $matrix[ $row ][ $k ] = $xy_Powers[ $row ];

// Initialize done.
$isDone = array();
for ( $column = 0; $column < $k; ++$column )
  $isDone[ $column ] = false;
  
// This loop will result in an upper-triangle matrix with the
// diagonals all 1--the first part of row-reduction--using 2
// elementary row operations: multiplying a row by a scalar, and
// subtracting a row by a multiple of an other row.
// NOTE: This loop can be done out-of-order.  That is, the first
// row may not begin with the first term.  Order is tracked in the
// "order" array.
$order = array();
for ( $column = 0; $column < $k; ++$column )
{
  // Find a row to work with.
  // A row that has a term in this column, and has not yet been
  // reduced.
  $activeRow = 0;
  while ( ( $activeRow < $k ) && ( ( 0 == $matrix[ $activeRow ][ $column ] )
         || ( $isDone[ $activeRow ] ) )
        )
  {
    ++$activeRow;
  }

  // Do we have a term in this row?
  if ( $activeRow < $k )
  {
    // Remember the order.
    $order[ $column ] = $activeRow;

    // Normalize row--results in the first term being 1.
    $firstTerm = $matrix[ $activeRow ][ $column ];
    for ( $subColumn = $column; $subColumn <= $k; ++$subColumn )
      $matrix[ $activeRow ][ $subColumn ] = $matrix[ $activeRow ][ $subColumn ]/$firstTerm;

    // This row is finished.
    $isDone[ $activeRow ] = true;

    // Subtract the active row from all rows that are not finished.
    for ( $row = 0; $row < $k; ++$row )
      if ( ( ! $isDone[ $row ] )
        && ( 0 != $matrix[ $row ][ $column ] ) )
      {
         // Get first term in row.
         $firstTerm = $matrix[ $row ][ $column ];
         for ( $subColumn = $column; $subColumn <= $k; ++$subColumn )
         {
           $accumulator =$firstTerm * $matrix[ $activeRow ][ $subColumn ];
           $matrix[ $row ][ $subColumn ] = $matrix[ $row ][ $subColumn ] - $accumulator;
         }
      }
  }
}

// Reset done.
for ( $row = 0; $row < $k; ++$row )
 $isDone[ $row ] = false;

$coefficients = array();

// Back-substitution.
// This will solve the matrix completely, resulting in the identity
// matrix in the x-locations, and the coefficients in the last column.
//   | 1  0  0 ... 0  c0 |
//   | 0  1  0 ... 0  c1 |
//   | .  .  .     .   . |
//   | .  .  .     .   . |
//   | 0  0  0 ... 1  cn |
for ( $column = ( $k - 1 ); $column >= 0; --$column )
{
  // The active row is based on order.
  $activeRow = $order[ $column ];

  // The active row is now finished.
  $isDone[ $activeRow ] = true;

  // For all rows not finished...
  for ( $row = 0; $row < $k; ++$row )
    if ( $isDone[ $row ]!=true )
    {
      $firstTerm = $matrix[ $row ][ $column ];

      // Back substitution.
      for ( $subColumn = $column; $subColumn <= $k; ++$subColumn )
      {
        $accumulator = $firstTerm * $matrix[ $activeRow ][ $subColumn ];
        $matrix[ $row ][ $subColumn ] = $matrix[ $row ][ $subColumn ] - $accumulator;
      }
    }

  // Save this coefficient.
  $coefficients[ $column ] = $matrix[ $activeRow ][ $k ];
}

$dataString6 = '';
for($m=$i;$m<=$i+10;$m++){
    $data[$m] = 0;
    $data_time[$m] = ' +'.($m-$i+1);
}
$first = true;
foreach($data as $x=>$y) {
        $yk2=0;
    for($j=0;$j<$k;$j++) {
        $yk2+=$coefficients[$j]*pow(f1($x),$j);
    }
    $dataString6.=($first?"":",")."['".$data_time[$x]."',".$yk2."]";
  $first = false;
}


    
?>
<script type="text/javascript" src="/includes/jscharts.js"></script>
<div id="chartcontainer">This is just a replacement in case Javascript is not
available or used for SEO purposes</div>
<script type="text/javascript">
var myData = new Array(<?echo $dataString;?>);
var myData6 = new Array(<?echo $dataString6;?>);
var myChart = new JSChart('chartcontainer', 'line');
myChart.setSize(1500, 600);
myChart.setDataArray(myData, '1');
myChart.setDataArray(myData6, '6');
myChart.setLineColor('#000000','1');
myChart.setLineColor('#f00','6');
myChart.setLegendForLine('1', 'Real');
myChart.setLegendForLine('6', 'Periodic');
myChart.setLineSpeed(100);
myChart.setLegendShow(true);
myChart.draw();
</script>

12

Re: Дайте цікаві задачі.

Vo_Vik написав:

а можна ще приклад вхідного файлу, бо самому влом придумувати)

До Нового року навряд зможу дати, бо треба вирізати шмат з величезного файлу, а часу поки не маю. 4 січня звільнюся - ось тоді дам файлу.

13

Re: Дайте цікаві задачі.

А програму написати не хочете?

14

Re: Дайте цікаві задачі.

задачі по PHP ?:)

15

Re: Дайте цікаві задачі.

Та в принципі мова не має значення. Цікавить щоб над алгоритмом можна було поламати голову) Просто мені легше писати на PHP)

16

Re: Дайте цікаві задачі.

Vo_Vik написав:

Кожен день заходжу по 2-3 рази на форум і крім волань про рішення дурних лабораторних нічого нема.
Може в кого ще є які цікаві задачі? Я вон відповідь про поїзд написав, але ніхто не відписав чи рішення правильне(

На цьому сайті є багато цікавих завдань, мова не має значення, відповіді приймають у вигляді цифри. Але на мою думку тут більше треба математику знати =)

http://projecteuler.net/problems

17

Re: Дайте цікаві задачі.

Vo_Vik написав:

Та в принципі мова не має значення. Цікавить щоб над алгоритмом можна було поламати голову) Просто мені легше писати на PHP)

Ось тема в якій реальна задача і головна фішка алгоритм ;)
http://replace.org.ua/post/5725/

18

Re: Дайте цікаві задачі.

Ще є дуже хороший сайт =) дійсно голову поламати можна не день і не тиждень над декими задачками =)
Особисто я дуже багато чому там навчився)

http://www.e-olimp.com/ua/