Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Вычисления матриц


Автор: f999t1 13.11.2008, 01:03
в чем может быть проблема
вычисляю значения матрицы phiQ , по следующей формуле

PhiQ(l)=(ww(l)*G(l)+bet(l)*z(l)/co(l)**2)/(0.5-G(l))

тип real*8

в одной программе вычисляются значения матриц справа
и заносятся в файл, кроме того в этой же программе вычисляется phiQ

Затем в другой проге считываются значения матриц из файла 
и вычисляется PhiQ по тойже формуле,
но результаты не совпадают (разница где-то на 1,0 но это существенно)!!!!!!!!!!

лишь при последних элементах в матрице они начинают быть близки друг у другу
в чем может быть проблема?

читает файл вроде правильно( пытался читать его во второй проге и сразу выводить 
то что прочитал, вроде все верно читает).

Автор: popovda 15.11.2008, 13:51
Гм...
Во-первых, если массивы комфорны (одного размера), то почему бы не написать так
Код

PhiQ=(ww*G+bet*z/co**2)/(0.5-G),

тем самым избавившись от цикла по l, а вы наверняка вводите данные в нём.

Во-вторых, вы не указали формат записи: пишите ли вы в файл только PhiQ или что-то ещё?

Я бы лично написал бы так:
Код

open(f_id, file = fname, status = 'replace')
write(f_id,"('f20.10')") (PhiQ(i), i=1,N)
close(f_id, status = 'keep')

если надо каждый элемент обязательно вписать на каждую строку,
или так - если хотим гарантировать однообразность ввода-вывода
Код

open(f_id, file = fname, status = 'replace')
write(f_id,*) PhiQ;
close(f_id, status = 'keep')


Не забывайте, что в Фортране массивы расположены в памяти по СТОЛБЦАМ, поэтому если у вас кол-во элементов PhiQ равно, скажем, N, и кол-во переменных - векторов размера N, которые вы пишите в файл так же N, то у вас просто могут данные считаться не в том порядке

Пример:

A = (/a1, a2, a3, a4/)
B = (/b1, b2, b3, b4/)
C = (/c1, c2,  c3, c4/)
D = (/d1, d2, d3, d4/)

Цикл записи выглядит так:

Код

do i=1,4
      write(fid,"(4(f15.7,1x))") a(i),b(i),c(i),d(i)
end do


В файле будет 
Код

a1 b1 c1 d1
a2 b2 c2 d2
a3 b3 c3 d3
a4 b4 c4 d4


А если прочитаем просто
read(fid,*) a,b,c,d
То 
A = (/a1,b1,c1,d1/)
B = (/a2,b2,c2,d2/)
и т.д.

И ещё. Если вы используете нестандартный формат (не *) для записи, то и читать вы должны именно с таким форматом.

Автор: Cr@$h 19.1.2009, 07:25
Цитата(f999t1 @  13.11.2008,  02:03 Найти цитируемый пост)
тип real*8

Запись или(и) чтение проводите не той точности.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)