Технический форум

Технический форум (http://www.tehnari.ru/)
-   Математика (http://www.tehnari.ru/f173/)
-   -   Четыре числовых ряда (http://www.tehnari.ru/f173/t98898/)

qimer 15.10.2014 18:30

Четыре числовых ряда
 
есть 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 15.10.2014 22:18

Да, кстати.. Коэффициент для первого ряда принимаем за 1. А остальные коэффициент нужно подобрать в соответствии с условием задачи

Gruvi 17.10.2014 19:24

Эххх.... А вы что-нибудь сами делали уже ?

qimer 17.10.2014 20:12

Цитата:

Сообщение от Gruvi (Сообщение 1070638)
Эххх.... А вы что-нибудь сами делали уже ?

С математикой сложно. Если бы там была элементарщина, не спрашивал бы
Один математик мне написал как это решается математически, но разобрать эти иероглифы сложно.
Вот ссылка на решение: http: // xn---------wofcfaecydkcaaiblreklarvcgpbbehpd8bv9bi7cxk3a4nb2a 3c.xn--p1ai/science/z141015-00.xml

Vladimir_S 17.10.2014 20:28

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

Vladimir_S 17.10.2014 20:34

Цитата:

Сообщение от qimer (Сообщение 1070651)
Вот ссылка на решение:

А, ну посмотрел - там всё ясно. Просто не было уверенности, что тут годится МНК, поскольку минимум может оказаться и в области отрицательных значений одного или нескольких коэффициентов, а это условием запрещено. А потому я пытался решать численно и вот - запутался. Ладно, попробую по МНК. Когда время выберу.

qimer 17.10.2014 21:28

Вложений: 2
Владимир, я наверное немного ошибся с постановкой задачи. Только щас понял. Два скрина во вложении.
Для начала, я точно знаю, из этих рядов надо вычесть средние их числа. Только в таком случае получится сделать некое подобие канала (2-й рисунок), путем умножения рядов на коэффициенты. Надо получить в итоге самый "узкий канал" (ряд)

Vladimir_S 17.10.2014 21:36

Цитата:

Сообщение от qimer (Сообщение 1070694)
Владимир, я наверное немного ошибся с постановкой задачи. Только щас понял. Два скрина во вложении. Для начала, я точно знаю, из этих рядов надо вычесть средние их числа. Только в таком случае получится сделать некое подобие канала (2-й рисунок), путем умножения рядов на коэффициенты. Надо получить в итоге самый "узкий канал" (ряд)

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

qimer 18.10.2014 13:16

Цитата:

Сообщение от Vladimir_S (Сообщение 1070699)
Не, ну тогда я совсем ничего не понимаю. Вы уж изложите условие задачи максимально подробно и внятно.

Задание остается прежним, как и было изначально. Коэффициенты должны быть положительными и отличными от 0. Любому ряду даем коэфф. 1, а остальные подбираются так, чтобы элементы получившегося ряда (который является суммой этих рядов) находились в некоем минимальном диапазоне, т.е. фактически максимально были приближены к 0. По той ссылке задача была решена математически, а мне нужно, чтобы мне помогли перевести эту задачу в алгоритм, по которому я сам потом напишу программу

Vladimir_S 19.10.2014 20:39

Вложений: 1
В общем, на текущий момент так.
Я рассмотрел аналитическое решение задачи по МНК. К сожалению, это решение не удовлетворило поставленному искусственному ограничению положительности коэффициентов, ибо один из них оказался-таки, сволочь, отрицательным. Тем не менее, я всё-таки решил выложить программу (на ТурбоПаскале) - мало ли, вдруг всё-таки пригодится.
Если же принять это дурацкое условие, то, во-первых, решать придется численно, во-вторых, требуется оговорить точность как самих коэффициентов, так и минимального "расстояния" до нуля, а в третьих - программа будет считать тройной цикл ужасно долго (если шаг задать хотя бы 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



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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.