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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2012, 23:02   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Дифференциальное уравнение, выводятся не те данные.

До этого работал в фортране, но понадобилось перевести код на C++. Выводятся не те данные, где ошибка?

Код:
#include <iostream>
using namespace std;

int main()
{
    
float dx,dt;   
float u[10][1];    
int i,n;    
    
dx=0.1;    
dt=0.1*dx*dx;


for(i=0;i<=10;i++) u[i][0]=0; 

    
for(n=1;n<=100;n++) { 

cout << n <<endl<<endl;

for(i=0;i<=10;i++)   
printf("%7.4f",u[i][0]);




cout << endl<<endl;
for(i=1;i<=9;i++) u[i][1]=((u[i+1][0]-(u[i][0])*2+u[i-1][0])*(dt/(dx*dx)))+u[i][0];

u[0][1]=0;
u[10][1]=1;

for(i=0;i<=10;i++) u[i][0]=u[i][1];

}
    
    
  cin.get();  
    return 0;}
ivan.tiran вне форума Ответить с цитированием
Старый 18.03.2012, 23:21   #2
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Вот тотже код на фортране 90

Код:
program pr 
implicit none
real*8 dx,dt   
real*8 u(0:10,0:1)    
integer*4 i,n    
    
dx=0.1   
dt=0.1*dx*dx


do i=10,10
 u(i,0)=0 
enddo
    
    do n=1,1000

write(*,*)
write(*,*)n
write(*,*)

do i=0,10   
write(*,"(F7.4,\)")u(i,0)
enddo


do i=1,9
u(i,1)=((u(i+1,0)-(u(i,0))*2+u(i-1,0))*(dt/(dx*dx)))+u(i,0)
enddo


u(0,1)=0
u(10,1)=1

do i=0,10
 u(i,0)=u(i,1)
enddo
enddo

read(*,*)
end program pr
Шаг по n я увеличил до 1000, чтобы сошлось решение
ivan.tiran вне форума Ответить с цитированием
Старый 19.03.2012, 00:59   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от ivan.tiran Посмотреть сообщение
где ошибка?
Код:
...
real*8 u(0:10,0:1) 
...
Код:
...
float u[10][1];    
...
Размерности Сишного массива.

ADDED 22:02 CET
Ну и уж если в Фортране REAL*8, то в Цэ тогда должно быть double.

Последний раз редактировалось Vago; 19.03.2012 в 01:02.
Vago вне форума Ответить с цитированием
Старый 19.03.2012, 09:24   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Ошибка точно не в этом

Извиняюсь, но причём тут real*8 и float , разница лишь в количестве выводимой памяти под переменную, real*8 - 8 байт. Значения в этой задачи меняются от 0 до 1, так что достаточно, к примеру и real*1 , float. real - это вещественные переменные.

Когда я пробовал double, то почему-то выдавались вообще огромные числа (больше одного). Ошибка в чём-то другом, может я с циклами не так работаю.
Но если ошибка и в этом, то тогда какой тип данных нужно использовать вместо float и double?
ivan.tiran вне форума Ответить с цитированием
Старый 19.03.2012, 09:34   #5
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Насчёт границ массива

Я бы его мог задать и не строго т.е. real*8 u(10,1), а как сторого задать граници массива в С++, так не получается u[0:10][0:1]
ivan.tiran вне форума Ответить с цитированием
Старый 19.03.2012, 10:05   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от ivan.tiran Посмотреть сообщение
Ошибка точно не в этом
Вы первую часть моего предыдущего поста прочитали??!! Циферки, выделенные красненьким, заметили? В чём "не в этом"??!! Не в том, что у Вас в Фортране матрица 11 x 2, а в Си - 10 x 1? К какой строке матрицы u[][] Вы обращаетесь вот здесь
Код:
for(i=0;i<=10;i++) u[i][0]=0;
при i = 10? У Вас место под эту строку зарезервировано? К какому столбцу матрицы u[][] Вы обращаетесь вот здесь
Код:
u[0][1]=0;
u[10][1]=1;
? У Вас место под столбец с индексом 1 зарезервировано? А, ещё раз спрашиваю, под строку, с индексом 10 ?!...
Vago вне форума Ответить с цитированием
Старый 19.03.2012, 10:17   #7
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Я наверное туплю...

Представленный код на фортране работает, на C++ нет, значит ошибка из-за синтексиса! Что конкретно надо изменить? Я так понимаю массив u[10][1] ничем не отличается от u(0:10,0:1).
ivan.tiran вне форума Ответить с цитированием
Старый 19.03.2012, 10:26   #8
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Всё теперь понятно

Границы массива надо задать u[11][2]
ivan.tiran вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В форме не выводятся данные AlexZZZ2010 Общие вопросы .NET 3 30.04.2014 18:03
В Access 2010 в отчете неправильно выводятся данные proavg Microsoft Office Access 4 07.01.2012 09:29
Помогите,пожалуйста, решить дифференциальное уравнение Emi Свободное общение 1 22.05.2009 17:36
Почему данные не сохраняются или не выводятся? SnowFall Помощь студентам 4 12.05.2009 01:21