![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 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( ![]() 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 |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,722
|
![]()
Старый добрый Фортран...
Если данных гарантировано не больше N, то и объяви статический массив нужного размера N. А считывание файла вполне обычное, ничего автоматического я тут не вижу. Вообще без файла обойтись? Заполнять массив руками или рандомно? Проще простого. Последний раз редактировалось digitalis; 12.05.2020 в 09:31. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
аппроксимация методом наименьших квадратов | 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 |