15.10.2014, 18:30 | #1 (permalink) |
Member
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
|
Четыре числовых ряда
Пример: Ряд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++) |
Пользователь сказал cпасибо: | DiM (15.10.2014) |
15.10.2014, 18:30 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Обратите внимание, что на форуме уже встречались темы с похожим содержанием Обработка и преобразование числовых последовательностей Два выхода или четыре? |
17.10.2014, 20:12 | #4 (permalink) |
Member
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
|
С математикой сложно. Если бы там была элементарщина, не спрашивал бы
Один математик мне написал как это решается математически, но разобрать эти иероглифы сложно. Вот ссылка на решение: http: // xn---------wofcfaecydkcaaiblreklarvcgpbbehpd8bv9bi7cxk3a4nb2a 3c.xn--p1ai/science/z141015-00.xml |
17.10.2014, 20:28 | #5 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Да я уж который день отлаживаю программку по этой задаче, а всё лажа вылезает, никак не добить.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
17.10.2014, 20:34 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А, ну посмотрел - там всё ясно. Просто не было уверенности, что тут годится МНК, поскольку минимум может оказаться и в области отрицательных значений одного или нескольких коэффициентов, а это условием запрещено. А потому я пытался решать численно и вот - запутался. Ладно, попробую по МНК. Когда время выберу.
|
17.10.2014, 21:28 | #7 (permalink) |
Member
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
|
Владимир, я наверное немного ошибся с постановкой задачи. Только щас понял. Два скрина во вложении.
Для начала, я точно знаю, из этих рядов надо вычесть средние их числа. Только в таком случае получится сделать некое подобие канала (2-й рисунок), путем умножения рядов на коэффициенты. Надо получить в итоге самый "узкий канал" (ряд) |
17.10.2014, 21:36 | #8 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
18.10.2014, 13:16 | #9 (permalink) |
Member
Регистрация: 15.10.2014
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Репутация: 60
|
Задание остается прежним, как и было изначально. Коэффициенты должны быть положительными и отличными от 0. Любому ряду даем коэфф. 1, а остальные подбираются так, чтобы элементы получившегося ряда (который является суммой этих рядов) находились в некоем минимальном диапазоне, т.е. фактически максимально были приближены к 0. По той ссылке задача была решена математически, а мне нужно, чтобы мне помогли перевести эту задачу в алгоритм, по которому я сам потом напишу программу
|
19.10.2014, 20:39 | #10 (permalink) |
Специалист
Регистрация: 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 |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|