Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] cуществует ли треугольник? 
:(
    Опции темы
FCM
Дата 25.10.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(TepH @  25.10.2010,  16:48 Найти цитируемый пост)
А, дошло. "a" всегда меньшее, "с" - большее.
Поэтому в облегчённом и равенство а=в и в=с (правда бежать пора, потом посмотрю)


Если имеется в виду
Код

if( a == b .and. b == c )  then
    print*, 'Ravnostoronnii'

то не поэтому.
Просто из a==b и b==c   следует   a=c.


Это сообщение отредактировал(а) FCM - 25.10.2010, 17:24
PM MAIL   Вверх
TepH
Дата 26.10.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.10.2010

Репутация: нет
Всего: нет



Цитата(FCM @  25.10.2010,  17:23 Найти цитируемый пост)
то не поэтому. Просто из a==b и b==c   следует   a=c.

Ну это я не туда глянул. Я имел в виду при сортировке, "а" становится меньшим, а "с" - бОльшим.

и получается, что код действует:
Код

if( a == b  .or. c == b  .or. a == c  ) print*,  'Ravnobedrennyi'


Спасибо, вы мне очень помогли! Надеюсь, сегодня получится сдать.

Только я никак не могу понять, что значит 
"0.d0"  - 0,0*10 в степени 0?
Код

if( c <= 0.d0 .or. b <= 0.d0 .or. a <= 0.d0 .or. (a + b - c) <= 0.d0 )

и почему eps'у присваивается число 1.d-8, а не 1.e-8. В чём разница между d и e?
Я пробовал менять, ничего не изменилось, вроде как.
Код

eps = 1.d-8


PM MAIL   Вверх
FCM
Дата 26.10.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(TepH @  26.10.2010,  15:03 Найти цитируемый пост)
Только я никак не могу понять, что значит 
"0.d0"  - 0,0*10 в степени 0?


Если в программе используется real(8), то буквальные константы желательно объявлять тоже как real(8).
1.e-8 - имеет тип real, но при присвоении real(8)-переменной преобразуется к real(8)
1.d-8  сразу имеет тип real(8).
Кстати, вместо 1.d-8 можешь попробовать и другие значения порога. 


0.d0 - просто 0 типа real(8).  

Это сообщение отредактировал(а) FCM - 26.10.2010, 15:13
PM MAIL   Вверх
TepH
Дата 6.11.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.10.2010

Репутация: нет
Всего: нет



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

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

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

!      parameter (n=600)

Я пробовал написать, к примеру:
Код

      parameter (n=600)
      dimension x(n), y(n)


Код

      program FUNC TEST
      integer Nx, k, l, i
      real h, Ma, Mi,  x, y
!      parameter (n=600)
      dimension x(600), y(600)

 10   print*, 'введите количество шагов (30-500)'
      read*, Nx
      if(Nx < 30 .or. Nx > 500) then
       print*, 'Ошибка. Введите заново'
       goto 10
      endif

      h=1/Nx
      do i=1, Nx+1

        x(i)=i*h
        y(i)=x(i)*(1-x(i))-1/8
        Ma=y(1)
      enddo
c     ищем максимум функции
      do i=1, Nx+1
c       M=y(1)
       if(y(i) > Ma) then
        Ma=y(i)
        K=i
       endif
      enddo
      Mi=y(1)
c     ищем минимум функции
      do i=1, Nx+1
       if(y(i) < Min) then
        Mi=y(i)
        l=i
       endif
      enddo

      do i=1, Nx+1
       print*, x(i),    y(i)
!      print*, Ma, '   ', k
      enddo
      end


PM MAIL   Вверх
FCM
Дата 6.11.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(TepH @  6.11.2010,  20:46 Найти цитируемый пост)
h=1/Nx

при целом Nx такое h дает ноль. Т.к. при целочисленном делении остаток отбрасывается.
Надо h = 1./Nx

Где тот там еще фигурирует 1/8 - замени на 1./8

Поиск максимума и минимума наверное можно в одном цикле сделать.

(В Фортране-90 есть стандартные функции поиска максимуиа и минимума массивов)

Это сообщение отредактировал(а) FCM - 6.11.2010, 21:28
PM MAIL   Вверх
TepH
Дата 6.11.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 24.10.2010

Репутация: нет
Всего: нет



Спасибо. С точкой заработало. 
А MAX, MIN, MaxLoc, MinLoc, MinVal, MaxVal, которые, как я понимаю, для минимумов-максимумов, у меня всё время ошибку выдают. Видимо как-то неправильно записываю. Единственное, что скомпиллировалось:
Код

      Ma=MAXVal(y)

Но ответ неверный совсем выдаёт.
Поэтому я и сделал циклом.
MAX просит, по крайней мере, два аргумента 
MaxLoc просит массив. Уж не знаю, чем ему мой не понравился.
Если написать
Код

 k=MaxLoc(y)


То ошибку такую выдаёт:

Код

      k=MaxLoc(y)
      1
Error: Incompatible ranks 0 and 1 in assignment at (1)

Чего-то ему несовместимо...

Это сообщение отредактировал(а) TepH - 6.11.2010, 23:24
PM MAIL   Вверх
FCM
Дата 7.11.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: 8
Всего: 9



Цитата(TepH @  6.11.2010,  23:10 Найти цитируемый пост)
То ошибку такую выдаёт:
Error: Incompatible ranks 0 and 1 in assignment at (1)
Чего-то ему несовместимо...


MINLOC в данном случае возвращает массив из одного элемента - поэтому проблема при присвоении скаляру.

В рамках Фортрана-90+ программа могла бы иметь вид
Код

      PROGRAM FUNC_TEST
      INTEGER :: NX
      REAL    :: H
      REAL, ALLOCATABLE :: X(:), Y(:)   ! Объявляем динамические массивы
 10   PRINT*, 'ENTER NUMBER OF STEPS (30-500)'
      READ*, NX
      IF( NX < 30 .OR. NX > 500 ) THEN
         PRINT*, 'ERROR. TRY AGAIN'
         GOTO 10
      ENDIF
      ALLOCATE( X(NX), Y(NX) )           ! Размещаем динамические массивы
      H = 1./(NX-1)
      DO I = 1, NX
         X(I) = I*H
         Y(I) = X(I)*(1-X(I))-1./8
      ENDDO
      PRINT*,  "Maximum of Y: ", MAXVAL(Y), "is achieved at X=" ,X(MAXLOC(Y))
      PRINT*,  "Minimum of Y: ", MINVAL(Y), "is achieved at X=" ,X(MINLOC(Y))
      DEALLOCATE(X,Y)                       ! Удаляем динамические массивы
      END


Возможно массив для X вводить необязательно, достаточно скаляра X
Код

      PROGRAM FUNC_TEST
      INTEGER :: NX
      REAL    :: H
      REAL, ALLOCATABLE :: Y(:)
 10   PRINT*, 'ENTER NUMBER OF STEPS (30-500)'
      READ*, NX
      IF( NX < 30 .OR. NX > 500 ) THEN
         PRINT*, 'ERROR. TRY AGAIN'
         GOTO 10
      ENDIF
      ALLOCATE( Y(NX) )
      H = 1./(NX-1)
      DO I = 1, NX
         X = I*H
         Y(I) = X*(1-X)-1./8
      ENDDO
      PRINT*,  "Maximum of Y: ", MAXVAL(Y), "is achieved at X=" , H*MAXLOC(Y)
      PRINT*,  "Minimum of Y: ", MINVAL(Y), "is achieved at X=" , H*MINLOC(Y)
      DEALLOCATE(Y)
      END


Это сообщение отредактировал(а) FCM - 7.11.2010, 14:59
PM MAIL   Вверх
AnyaPotehina
Дата 24.12.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 24.12.2010

Репутация: нет
Всего: нет



5.6:
      SUBROUTINE para_range(1, n, nprocs, myrank, ista, iend)
     1
Error: Unclassifiable statement at (1)

что это за ошибка, подскажите, пожалуйста

PROGRAM main
      INCLUDE 'mpif.h'
      PARAMETER (n = 1000)
      DIMENSION a(n)
      SUBROUTINE para_range(1, n, nprocs, myrank, ista, iend)
      iwork = (n - 1)/nprocs + 1
      ista = MIN(myrank*iwork + 1, n + 1)
      iend = MIN(ista + iwork - 1, n)
      CALL MPI_INIT(ierr)
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
      CALL para_range(1, n, nprocs, myrank, ista, iend)
      DO i = ista, iend
      a(i) = i
      ENDDO
      sum = 0.0
      DO i = ista, iend
      sum = sum + a(i)
      ENDDO
      CALL MPI_REDUCE(sum,ssum,1,MPI_REAL,
     & MPI_SUM, 0, MPI_COMM_WORLD, ierr)
      sum = ssum
      IF (myrank == 0) PRINT *,'sum=',sum
      CALL MPI_FINALIZE(ierr)
      END


программа считает сумму элементов массива a( )
она распараллелена, повторяющиеся операции распределены на блоки и каждый процесс вычисляет свою частичную сумму множества в вычисленном диапазоне с помощью подпрограммы para_range. Частичные суммы вконце суммируются MPI_REDUCE.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0994 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.