Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Математика


Ответ
 
Опции темы Опции просмотра
Старый 15.10.2014, 18:30   #1 (permalink)
qimer
Member
 
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
По умолчанию Четыре числовых ряда

есть 4 числовых ряда с N элементами каждый.
Пример:

Ряд1 57 -25 -74 -47 -73 16 41
Ряд2 -43 -81 90 -79 -73 32 -29
Ряд3 -71 -9 76 -50 34 52 -19
Ряд4 54 98 69 70 93 -31 14

Необходимо найти такие коэффициенты, на которые надо умножить каждый ряд, чтобы элементы числового ряда, получившегося в результате суммы этих 4х числовых рядов, имели наименьшее отклонение от 0. Коэффициенты должны быть только положительные и не равны 0.

(Basic, Pascal, C++)
qimer вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
DiM (15.10.2014)

Старый 15.10.2014, 18:30
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Обратите внимание, что на форуме уже встречались темы с похожим содержанием

Обработка и преобразование числовых последовательностей
Два выхода или четыре?

Старый 15.10.2014, 22:18   #2 (permalink)
qimer
Member
 
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
По умолчанию

Да, кстати.. Коэффициент для первого ряда принимаем за 1. А остальные коэффициент нужно подобрать в соответствии с условием задачи
qimer вне форума   Ответить с цитированием
Старый 17.10.2014, 19:24   #3 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

Эххх.... А вы что-нибудь сами делали уже ?
Gruvi вне форума   Ответить с цитированием
Старый 17.10.2014, 20:12   #4 (permalink)
qimer
Member
 
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
По умолчанию

Цитата:
Сообщение от Gruvi Посмотреть сообщение
Эххх.... А вы что-нибудь сами делали уже ?
С математикой сложно. Если бы там была элементарщина, не спрашивал бы
Один математик мне написал как это решается математически, но разобрать эти иероглифы сложно.
Вот ссылка на решение: http: // xn---------wofcfaecydkcaaiblreklarvcgpbbehpd8bv9bi7cxk3a4nb2a 3c.xn--p1ai/science/z141015-00.xml
qimer вне форума   Ответить с цитированием
Старый 17.10.2014, 20:28   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да я уж который день отлаживаю программку по этой задаче, а всё лажа вылезает, никак не добить.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 17.10.2014, 20:34   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от qimer Посмотреть сообщение
Вот ссылка на решение:
А, ну посмотрел - там всё ясно. Просто не было уверенности, что тут годится МНК, поскольку минимум может оказаться и в области отрицательных значений одного или нескольких коэффициентов, а это условием запрещено. А потому я пытался решать численно и вот - запутался. Ладно, попробую по МНК. Когда время выберу.
Vladimir_S вне форума   Ответить с цитированием
Старый 17.10.2014, 21:28   #7 (permalink)
qimer
Member
 
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
По умолчанию

Владимир, я наверное немного ошибся с постановкой задачи. Только щас понял. Два скрина во вложении.
Для начала, я точно знаю, из этих рядов надо вычесть средние их числа. Только в таком случае получится сделать некое подобие канала (2-й рисунок), путем умножения рядов на коэффициенты. Надо получить в итоге самый "узкий канал" (ряд)
Миниатюры
4-dhyaea.png   noiia-dhyaeia.png  
qimer вне форума   Ответить с цитированием
Старый 17.10.2014, 21:36   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от qimer Посмотреть сообщение
Владимир, я наверное немного ошибся с постановкой задачи. Только щас понял. Два скрина во вложении. Для начала, я точно знаю, из этих рядов надо вычесть средние их числа. Только в таком случае получится сделать некое подобие канала (2-й рисунок), путем умножения рядов на коэффициенты. Надо получить в итоге самый "узкий канал" (ряд)
Не, ну тогда я совсем ничего не понимаю. Вы уж изложите условие задачи максимально подробно и внятно.
Vladimir_S вне форума   Ответить с цитированием
Старый 18.10.2014, 13:16   #9 (permalink)
qimer
Member
 
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Не, ну тогда я совсем ничего не понимаю. Вы уж изложите условие задачи максимально подробно и внятно.
Задание остается прежним, как и было изначально. Коэффициенты должны быть положительными и отличными от 0. Любому ряду даем коэфф. 1, а остальные подбираются так, чтобы элементы получившегося ряда (который является суммой этих рядов) находились в некоем минимальном диапазоне, т.е. фактически максимально были приближены к 0. По той ссылке задача была решена математически, а мне нужно, чтобы мне помогли перевести эту задачу в алгоритм, по которому я сам потом напишу программу
qimer вне форума   Ответить с цитированием
Старый 19.10.2014, 20:39   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

В общем, на текущий момент так.
Я рассмотрел аналитическое решение задачи по МНК. К сожалению, это решение не удовлетворило поставленному искусственному ограничению положительности коэффициентов, ибо один из них оказался-таки, сволочь, отрицательным. Тем не менее, я всё-таки решил выложить программу (на ТурбоПаскале) - мало ли, вдруг всё-таки пригодится.
Если же принять это дурацкое условие, то, во-первых, решать придется численно, во-вторых, требуется оговорить точность как самих коэффициентов, так и минимального "расстояния" до нуля, а в третьих - программа будет считать тройной цикл ужасно долго (если шаг задать хотя бы 0.01, а если еще меньше - то и вовсе до потери пульса). Аналитическое же решение проходит мгновенно и выдает истинный minimum minimorum, т.е. координаты направленной вниз "попы" четырехмерного параболоида.
Все пояснения по расчету - в приложенном вордовском файле.
Код:
Const
 M:Array[1..4,1..7] of Real=(( 57, -25, -74, -47, -73,  16,  41),
                             (-43, -81,  90, -79, -73,  32, -29),
                             (-71,  -9,  76, -50,  34,  52, -19),
                             ( 54,  98,  69,  70,  93, -31,  14));
 eps=0.00001;

type
 matr=array [1..3,1..3] of real;
 mas=array [1..3] of real;
var
 i,j,p:integer;
 b,x:mas;
 a:matr;

procedure Gauss(ag:matr; bg:mas; var xg:mas; Ng:integer);
 Var
  k,ig,jg:byte;
  m,s:real;
  blg:boolean;
  c:mas;
 begin
  for k:=1 to Ng-1 do
   begin
    if ABS(ag[k,k])<eps then
     begin
      ig:=k;
      blg:=false;
      repeat
       Inc(ig);
       if ABS(ag[ig,k])>eps then
        begin
         blg:=true;
         c:=ag[k];
         ag[k]:=ag[ig];
         ag[ig]:=c;
         s:=bg[k];
         bg[k]:=bg[ig];
         bg[ig]:=s;
        end;
      until blg;
     end;
    m:=ag[k,k];
    for jg:=k to Ng do
     ag[k,jg]:=ag[k,jg]/m;
    bg[k]:=bg[k]/m;
    for ig:=k+1 to Ng do
     if ABS(ag[ig,k])>eps then
      begin
       m:=ag[ig,k];
       for jg:=k to Ng do
        ag[ig,jg]:=ag[k,jg]-ag[ig,jg]/m;
       bg[ig]:=bg[k]-bg[ig]/m;
      end
     else
      ag[ig,k]:=0;
   end;
 xg[Ng]:=bg[Ng]/ag[Ng,Ng] ;
 for ig:=(Ng-1) downto 1 do
  begin
   s:=0;
   For jg:=ig+1 to Ng do
    s:=s+ag[ig,jg]*xg[jg] ;
   xg[ig]:=bg[ig]-s;
  end;
end;

Begin
 for i:=1 to 3 do
  begin
   for j:=1 to 3 do a[i,j]:=0;
   b[i]:=0;
  end;
 for i:=1 to 3 do
  for j:=1 to 3 do
   for p:=1 to 7 do
    a[i,j]:=a[i,j]+M[j+1,p]*M[i+1,p];
 for i:=1 to 3 do
  begin
   for p:=1 to 7 do b[i]:=b[i]+M[1,p]*M[i+1,p];
   b[i]:=-b[i];
  end;
 Gauss(a,b,x,3);

 writeln('C[1] =  1.00000');
 for i:=1 to 3 do
  writeln('C[',i+1,'] = ',x[i]:8:5);
 readln
End.
Результат:
Код:
C1 =  1.00000
C2 = -0.10954
C3 =  0.67048
C4 =  0.42719
Вложения
Тип файла: doc MinMin.doc (35.5 Кб, 183 просмотров)
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 17:02.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.