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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2020, 07:11   #1
Igor1997
 
Регистрация: 11.05.2020
Сообщений: 7
По умолчанию аппроксимация данных методом наименьших квадратов

как сделать без динамического массива и без автоматического считывания данных файла?
PROGRAM APROX
IMPLICIT NONE

REAL, EXTERNAL :: AVERAGE, K ! объявление функций
INTEGER :: IOS=0, COUNT=0 ! служебные переменные, нужны для автоматического считывания файла
INTEGER :: I ! переменная для циклов
LOGICAL :: OUT_LOGIC=.FALSE. ! Переменная для отображения предсказанных значений

REAL, ALLOCATABLE, DIMENSION( :: T, X ! объявляем массивы для значений времени и координаты
REAL :: AVERAGE_T1,AVERAGE_T2,AVERAGE_X1, AVERAGE_X2 ! объявляем переменные для средних значений времени и координаты. Нужны для красоты формулы, можно было-бы обойтись и без них
REAL :: K1, K2, B1, B2 ! объявляем переменные для коэффициента K и B для двух участков
INTEGER :: COUNT1, COUNT2, START=0 ! объявляем количество точек для двух разных участков, переменная START служит для того, чтобы средние значения для двух разных участков правильно считывали из массива входные значения, то есть первый участок это номера 1-7, второй участок это соотвественно 8-20
REAL :: Y1, Y2, Y3, Y4, T_CUSTOM, Y_CUSTOM ! обявляем переменные для построения графика

OPEN (UNIT=1, FILE='IN.txt')
DO !
READ (1,*,IOSTAT=IOS) !
IF (IOS==-1) EXIT ! эта часть считает сколько измерений записано в файле
COUNT=COUNT+1 !
END DO !
REWIND 1


ALLOCATE (T(0:COUNT-1))
ALLOCATE (X(0:COUNT-1))


DO I=0,COUNT-1 !
READ(1,*) T(I), X(I) ! Считывание файла
! PRINT*, T(I), X(I) !берется COUNT-1 потому, что измерения начинаются с нулевого значения
END DO !
CLOSE(1) !

PRINT*, "PRINT SKOLKO TOCHEK V 1 YCHASTKE" ! Оптимально брать либо значение 8, либо 9
READ(*,*) COUNT1 !
PRINT*, "PRINT SKOLKO TOCHEK V 2 YCHASTKE" ! Оптимально брать либо значение 13 либо 12
READ(*,*) COUNT2 !

AVERAGE_T1=AVERAGE(T,COUNT1-1,START,COUNT1) ! здесь считаются средние значения для T и X
AVERAGE_X1=AVERAGE(X,COUNT1-1,START,COUNT1) !Можно было-бы обойтись и без этих значений и напрямую писать функции AVERAGE() в K и B, но так было бы тяжелее читать программу
START=COUNT-COUNT2 ! Значения START служить для того, чтобы функция брала из массива правильные значения X и T, грубо говоря с какого элемента массива начинать считать
!PRINT*, START, COUNT-1, COUNT2 !
AVERAGE_T2=AVERAGE(T,COUNT-1,START,COUNT2) !
AVERAGE_X2=AVERAGE(X,COUNT-1,START,COUNT2) !

START=0 !
K1=K(T,X,AVERAGE_T1,AVERAGE_X1,COUN T1-1,START) ! Считается коэффициент K для двух участков
START=COUNT-COUNT2 !
K2=K(T,X,AVERAGE_T2,AVERAGE_X2,COUN T-1,START) !


B1=AVERAGE_X1-K1*AVERAGE_T1 !Считается коэффициент B для двух участков
B2=AVERAGE_X2-K2*AVERAGE_T2 !

Y1=K1*0+B1 ! считается значения точки для построения графика
Y2=K2*0+B2 !Идея такая: берется значение функции в нуле и в 20, и на основании этих координат проводится график для двух участков
Y3=K1*20+B1 !
Y4=K2*20+B2 !

OPEN(UNIT=1,FILE='OUT.TXT')
!WRITE(1,*) "AVERAGE_T1=", AVERAGE_T1
!WRITE(1,*) "AVERAGE_T2=", AVERAGE_T2


! X Y1 Y2 X-значение времени, Y1 и Y2 значение функций в соотвествующих точках
WRITE(1,*) 0, Y1, Y2 ! Записываются в файл значения координат для построения графика
WRITE(1,*) 20, Y3, Y4 !
!WRITE(1,'(20F)') AVERAGE_X1, AVERAGE_X2, K1, K2, B1, B2

PRINT*, "PRINT ZNACHENIYE T DLYA PREDSKAZIVANIYA(ETO 50)"
READ(*,*) T_CUSTOM

IF (T_CUSTOM<=COUNT1) THEN ! Ответ на вопрос, поставленный в лабе и даже немного больше, что-то типо "предсказывателя" положения точки на всем участке
Y_CUSTOM=K1*T_CUSTOM+B1 !
OUT_LOGIC=.TRUE. !
ELSE !
Y_CUSTOM=K2*T_CUSTOM+B2 !
END IF !

IF (OUT_LOGIC.eqv..TRUE.) THEN
PRINT*, "PRI DVIZHENII PO YCHASTKY 1 S SKOROSTU", K1, "SPYSTA", T_CUSTOM, "SECUND TELO OKAZHETSYA V X=", Y_CUSTOM
ELSE
PRINT*, "PRI DVIZHENII PO YCHASTKY 2 S SKOROSTU", K2, "SPYSTA", T_CUSTOM, "SECUND TELO OKAZHETSYA V X=", Y_CUSTOM
END IF


CLOSE(1)
DEALLOCATE(T)
DEALLOCATE(X)
STOP
END PROGRAM APROX



REAL FUNCTION AVERAGE(X,COUNT,START,QUANITY) ! фукнция для расчета средних значений
INTEGER :: COUNT, START, QUANITY ! COUNT и START - границы считывания массива, QUANITY-количество переменных
REAL :: AVER
REAL, DIMENSION(0:COUNT) :: X
AVERAGE=0
AVER=0
DO I=START,COUNT
! PRINT*, AVER, X(I), I
AVER=AVER+X(I)

END DO
AVERAGE=AVER*(1./(QUANITY))
RETURN
END FUNCTION AVERAGE



REAL FUNCTION K(T,X,AVERAGE_T,AVERAGE_X,COUNT,STA RT) !Функция для рассчета коэффициента K
INTEGER :: COUNT, START !Аналогично как и в AVERAGE()
REAL :: AVERAGE_T, AVERAGE_X
REAL, DIMENSION (0:COUNT) :: T, X
REAL :: A, B
A=0
B=0
DO I=START,COUNT
! PRINT*, I, A,B, START, COUNT
A=A+(T(I)-AVERAGE_T)*(X(I)-AVERAGE_X) !Считается числитель формулы
B=B+(T(I)-AVERAGE_T)**2 ! считается знаменатель формулы
END DO
K=A/B
RETURN
END FUNCTION K
Igor1997 вне форума Ответить с цитированием
Старый 12.05.2020, 09:22   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,722
По умолчанию

Старый добрый Фортран...
Если данных гарантировано не больше N, то и объяви статический массив нужного размера N. А считывание файла вполне обычное, ничего автоматического я тут не вижу. Вообще без файла обойтись? Заполнять массив руками или рандомно? Проще простого.

Последний раз редактировалось digitalis; 12.05.2020 в 09:31.
digitalis вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
аппроксимация методом наименьших квадратов ARAGON Паскаль, Turbo Pascal, PascalABC.NET 0 14.12.2013 18:57
Аппроксимация методом наименьших квадратов kamil83 Помощь студентам 0 22.02.2011 17:33
Аппроксимация методом наименьших квадратов KSuxa1989 Помощь студентам 2 08.09.2010 15:20
Аппроксимация функции методом наименьших квадратов(МНК) vitaly38 Помощь студентам 1 29.03.2010 21:50
Паскаль. Аппроксимация функции методом наименьших квадратов. 3abeel Фриланс 17 13.07.2009 09:21