Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2012, 00:24   #1
rusfin01
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 25
Стрелка Аппроксимация МНК (чуточку график нужно подправить)

Суть в том, что график должен быть плавный, а у меня ломаными линиями. Помогите плиз исправить. Вот сам код программы
Код:
uses crt, graph;
const k=2;
n = 37;
Coord_Y: array[0..n] of integer = (26,31,26,26,30,29,27,30,33,24,23,21,25,22,22,18,21,19,17,23,15,19,23,17,18,17,19,21,22,21,15,11,12,10,8,11,10,8);
type mtrx = array[0..n, 0..n] of real;
     work_mas = array[0..n] of integer;
     hlp_mas = array[0..n] of real;
var i, j, d, m, i1, j1, i2, dg, dm :integer;
     Matrix:mtrx;
     Mas_B, x:hlp_mas;
     Coord_X:work_mas;
     y, y0, sum, t, r, g :real;
 
function step(x:real;y:integer):real;
    var st:real; i:integer;
    begin
        st := 1;
        for i:=1 to y do st:= st * x;
        step := st;
    end;
 
begin
    clrscr;
    randomize;
       for i := 0 to n do Coord_X[i] := i;
        writeln('Obichii massiv:');
        for i := 0 to n do write(Coord_X[i],' ');
    writeln;writeln;
        writeln('Rabochii massiv:');
        for i := 0 to n do write(Coord_Y[i],' ');
    writeln;
    readkey;
 
    for i:=0 to k do {massiv.A}
        for j:=0 to k do
            begin
                Matrix[i,j]:=0;
                for i1:=0 to n do
                    Matrix[i,j] := Matrix[i,j] + Step(Coord_X[i1], i+j);
            end;
 
    for i:=0 to k do{massiv.B}
        begin
            Mas_B[i]:=0;
            for i1:=0 to n do
                Mas_B[i]:=Mas_B[i]+Coord_Y[i1]*step(Coord_X[i1],i);
        end;
 
    for i:=0 to k do begin
        for j:=0 to k do begin
            if Matrix[i,i]=0 then begin
                for i1:=i to k-1 do
                    if Matrix[i1+1,i1]<>0 then begin
                        for i2:=0 to k do
                            begin
                               t:=Matrix[i1,i2];
                               Matrix[i1,i2]:=Matrix[i1+1,i2];
                               Matrix[i1+1,i2]:=t;
                            end;end;end;end;  end;
 
    for i:=0 to k do  begin{korni_Gaussa}
        for j:=i+1 to k do
            begin
                r:=Matrix[j,i]/Matrix[i,i];
                for i2:=i to k do
                    Matrix[j,i2]:=Matrix[j,i2]-r*Matrix[i,i2];
                Mas_B[j]:=Mas_B[j]-r*Mas_B[i];
            end; end;
 
    for i:=k downto 0 do
        begin
            r:=0;
            for j:=i+1 to k do
                begin
                    g:=Matrix[i,j]*x[j];
                    r:=r+g;
                end;
            for i2:=0 to k do begin
                for j:=0 to k do begin
                    if Matrix[i2,i2]=0 then begin
                        for i1:=i2 to k-1 do begin
                            if Matrix[i1+1,i1]<>0 then
                                begin
                                  t:=Matrix[i1,i1];
                                   Matrix[i1,i1]:=Matrix[i1+1,i1];
                                   Matrix[i1+1,i1]:=t;
                                end; end;end;end;end;
            x[i]:=(Mas_B[i]-r)/Matrix[i,i];
        end;
 
    filemode := 0;
    d := detect;
    initgraph(d,m,'');
 
    y0:=x[0];{vivod_tochek}
        for i:=0 to n-1 do    begin
        circle((round(Coord_X[i]*10)),10+round(Coord_Y[i])*10,3);
                                   end;
        MoveTo(Coord_X[0]+10, round(Coord_Y[0])*10);{vivod_prymix}
    sum:=(Coord_Y[0]-y0);
    i1:=1;
    i2:=1;
    repeat
        begin
            y:=x[0];
            for i:=1 to k do
            y := y + x[i] * (Coord_X[i1] * (step(Coord_X[i1],i) / Coord_X[i1]));
            sum:= sum + Coord_Y[i2] - y;
            LineTo(Coord_X[i1]*10 + 10, round( y) * 10);
        end;
        i1 := i1 + 2;
        i2 := i2 + 1;
    until i1 > n;
    readkey;
    closegraph;
end.
rusfin01 вне форума Ответить с цитированием
Старый 24.10.2012, 16:25   #2
rusfin01
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 25
По умолчанию

Люди, блин сложно помочь чтоли?
rusfin01 вне форума Ответить с цитированием
Старый 24.10.2012, 18:36   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

да так же, как Вы уже написали, только каждый отрезок между точками разбиваете на еще несколько отрезков. В этом вся суть аппроксимации.

Не совсем понятно, зачем нужен массив игреков? Если бы была формула - график был бы изначально плавнее.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 25.10.2012, 13:45   #4
rusfin01
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 25
По умолчанию

Можете пожалуйста поправить код, чтобы заработало?)
rusfin01 вне форума Ответить с цитированием
Старый 25.10.2012, 21:35   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вы не поверите, но самый простой способ сгладить график, который я нашел - увеличить это число:

Код:
 i1 := i1 + 2;
это в самом низу, где выводится график

В прогу особо не вникал, но тот способ, который я предложил выше, сюда явно не подходит - слишком маленькие интервалы, которые при округлении дадут 0 либо 1 и ни разу не исправят ситуацию.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
График в делфи с TChart (аппроксимация. метод наименьших квадратов) dimanoxxy Фриланс 3 12.06.2012 18:22
График в делфи с TChart (аппроксимация. метод наименьших квадратов) dimanoxxy Общие вопросы Delphi 1 12.06.2012 14:44
нужно подправить задачку mashat99 Паскаль, Turbo Pascal, PascalABC.NET 1 21.03.2011 00:27
Нужно подправить код zeppelin58 Общие вопросы C/C++ 1 28.05.2010 12:11
Аппроксимация функции методом наименьших квадратов(МНК) vitaly38 Помощь студентам 1 29.03.2010 21:50