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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2016, 10:24   #1
Katyam
 
Регистрация: 24.05.2016
Сообщений: 7
По умолчанию C++ Решение уравнения теплопроводности разными методами. Оформление функциями не работает.

Мне нужно вычислить решение уравнения теплопроводности разными методами и накопить решение на каждом шаге в матрицу, чтобы можно были сравнить нужные шаги разных методов. Отдельными программами все работает верно. Как только оформляю одну с функциями—выдает ошибки.
Прогоняю программу онлайн здесь

Гуглила на эту тему и уже все перепробовала: и описывать функции в int main (), и вне. Не помогает.


Код



PHP код:
#include <iostream>
#include <math.h>
#include <cmath>

using namespace std;

void explicit (double hdouble taudouble Ndouble Tdouble alphadouble betadouble kint l);
void exact (double alphadouble betadouble kdouble pidouble taudouble hint Ndouble T);
void implicit (double Ndouble Tdouble alphadouble betadouble kdouble hdouble tauint l);


int main()
{
    
//ЯВНАЯ СХЕМА
void explic (double hdouble taudouble Ndouble Tdouble alphadouble betadouble kint l) {
  
double pi=3.14159265358979323846;
  
double timing=0;
  
double u0[N], u[N];
  
int z=0//счетчик слоя

  //нулевой слой
  
cout << endl;
  
cout << "• " << << " СЛОЙ" << " ⟶   ";

  
//начальные условия
  
for (int i 0<= Ni++)
  {
    
u0[i]=sin(pi*k*i*h);
    
explic[0][i]=u0[i];
    
cout <<u0[i] << ",  ";
  }

  
//переопределяем значения на границах нулевого слоя
  
u0[0]=0// u=a*t
  
u0[N]=0// u=b*t

  
cout << endl;
  while(
timing<T)
  {
    
timing timing+tau;
    
z=z+1;
    
l=z;

    for (
int i 0<= Ni++)
    {
      
u[i]=u0[i]+(timing/(h*h))*(u0[i+1]-2*u0[i]+u0[i-1]);
      
explic[l][i]=u[i];
    }
    
u[0]=a*timing;
    
u[N]=b*timing;
    
explic[l][0]=u[0];
    
explic[l][N]=u[N];


    
cout<< "СЛОЙ=" << << endl;
    for (
int i 0<= Ni++)
    {
      
cout << u[i] << ",  ";
    }

    for(
int i 0<= Ni++)
    {
       
u0[i] = u[i];
    }
    
cout << endl;
  }
}


//НЕЯВНАЯ СХЕМА
void implicit(double Ndouble Tdouble alphadouble betadouble kdouble hdouble tauint l) {
  
double pi=3.14159265358979323846;
  
double timing=0t=0;
  
double u0[N], u[N];
  
double abc//коэффициенты в системе
  
double Ai[N],Bi[N]; //массивы коэффициентов
  
int z=0//счетчик слоя

  //нулевой слой
  
cout << endl;
  
cout << "СЛОЙ=" << << endl;
  
cout << "• " << "U0i: ";

  
//начальные условия
  
for (int i 0<= Ni++)
  {
    
u0[i]=sin(pi*k*i*h);
    
// cout <<u0[i] << ",  ";
  
}

  
//переопределяем значения на границах нулевого слоя
  
u0[0]=0// u=a*t
  
u0[N]=0// u=b*t

  //выводим нулевой слой
  
cout << " " << endl;
  
cout << "C учетом граничных" <<endl;
  
cout << "• " << "U0i: ";
  for (
int i 0<= Ni++)
  {
    
cout << u0[i] << ",  ";
  }

  
//коэффициенты системы
  
cout << endl;
  
a=(-1.0)*((2.0/(h*h)+1.0/tau));
  
cout << "• " << "a:  " << << ",  ";
  
b=1.0/(h*h);
  
cout << "b:  " << << ",  ";
  
c=(-1.0)/tau;
  
cout << "c:  " << << endl;

  
cout << endl;
  while(
timing<T)
  {
    
timing timing+tau;
    
z=z+1;
    
l=z;

    
//A1 и B1
    
Ai[1]=-b/a;
    
Bi[1]=(c*u0[1]-b*alpha*timing)/a;

    
//Ai и Bi
    
for (int i 1<= N-3i++)
    {
      
Ai[i+1]=-b/(b*Ai[i]+a);
      
Bi[i+1]=(c*u0[i+1]-b*Bi[i])/(b*Ai[i]+a);
    }

    
//An-1 и Bn-1
    
Ai[N-1]=0;
    
Bi[N-1]=(c*u0[N-1]-b*beta*timing)/(b*Ai[N-2]+a);

    
//Прогонка
    
u[0]=alpha*timing;
    
u[N-1]=Bi[N-1];
    
u[N]=beta*timing;
    
impl[l][0]=alpha*timing;
    
impl[l][N-1]=Bi[N-1];
    
impl[l][N]=beta*timing;

    for (
int i=1i<=N-2;i++)
    {
      
u[N-i-1]=Ai[N-i-1]*u[N-i]+Bi[N-i-1];
      
impl[l][N-i-1]=u[N-i-1];
    }

    
cout << endl;

    
//Выводим решение
    
cout << "СЛОЙ=" << << endl;
    
cout << "• " << "Ui" << " ⟶   ";
    for (
int i=0i<=Ni++)
    {
       
cout << u[i] << ",  ";
    }

    
//Печатаем прогоночные коэффициены А
    
cout << "• " << "Аi" << " ⟶   ";
    for (
int i=1i<=N-1i++)
    {
      
cout <<Ai[i] << ",  ";
    }

    
//Печатаем прогоночные коэффициены B
    
cout << endl;
    
cout << "• " << "Bi" << " ⟶   ";
    for (
int i=1i<=N-1i++)
    {
      
cout <<Bi[i] << ",  ";
    }

    
//Запоминаем этот слой
    
for(int i 0<= Ni++)
    {
       
u0[i] = u[i];
    }

    
cout << endl;

  }

}

//ТОЧНОЕ РЕШЕНИЕ
void exact(double alphadouble betadouble kdouble pidouble taudouble hint Ndouble T) {
  
double homogeneousinhomogeneoustiming=0;
  
double u[N];
  
int n=10;
  
l=1;

  while (
timing<T) {

    for (
int i=0i<=Ni++)
    {
      
//решение однородного уравнение (𝛏't=𝛏''xx)
      
homogeneous=alpha*timing*(1-h*i)+beta*timing*h*i+(exp(-pow(pi*k,2)*timing))*sin(pi*k*h*i);

      
//решение неоднородного уравнение (𝛈't=𝛈''xx - 𝛍...)
      
for(int j=1j<=nj++)
      {
        
inhomogeneous=inhomogeneous+(2/(pow(pi*j,3)))*(alpha-(pow(-1j))*beta)*sin(pi*j*h*i)*(exp(-pow(pi*j,2)*timing)-1);
      }
      
u[i]=homogeneous+inhomogeneous;
      
u[0]=alpha*timing;
      
u[N]=beta*timing;
      
ex[l][0]=u[0];
      
ex[l][N]=u[N];

      
cout << u[i] << " ";
    }
    
timing=timing+tau;
    
l=l+1;
  }
}

    
    
double pi=3.14159265358979323846;
    
double htautiming=0t=0;
    
double Talphabeta;
    
int kN;

    
cout << "Введите разбиение по x: ";
    
cin >> N;

    
cout << "Введите конечное время: ";
    
cin >> T;

    
cout << "Введите коэффициент левого гр. усл.: ";
    
cin >> alpha;

    
cout << "Введите коэффициент правого гр. усл.: ";
    
cin >> beta;

    
cout << "Введите коэффициент начального условия u(x,0)=sin(pi*k*x): ";
    
cin >> k;

    
int l=1//кол-во слоев

    //посчитали шаг по x
    
h=1.0/N;
    
cout << "h=" << << ", ";

    
//посчитали шаг по t
    
tau=h*h/2;
    
cout << "tau=" << tau << endl;

    
l=T/tau//сколько будет слоев, чтобы знать размерность массива

    //массивы, где будут записаны все слои каждого метода
    
double explic[l][N];
    
double impl[l][N]; 
    
double ex[l][N]; 

    
explic(htauNTalphabetakl);


    
cout << "Введите номер слоя для явного метода: ";
    
cin >> l;
    for (
int i=0<= Ni++)
    {
      
cout << "Явный метод:" << explic[l][] << endl;
    }

    return 
0;


Какие ошибки выдает:


Код:
main.cpp:7:16: error: expected unqualified-id before 'double'                                                                                                   
 void explicit (double h, double tau, double N, double T, double alpha, double beta, double k, int l);                                                          
                ^                                                                                                                                               
main.cpp:7:16: error: expected ')' before 'double'                                                                                                              
main.cpp:11:16: error: expected unqualified-id before 'double'                                                                                                  
 void explicit (double h, double tau, double N, double T, double alpha, double beta, double k, int l) {                                                         
                ^                                                                                                                                               
main.cpp:11:16: error: expected ')' before 'double'
Katyam вне форума Ответить с цитированием
Старый 24.05.2016, 10:35   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

explicit - это зарезервированное слово языка http://en.cppreference.com/w/cpp/language/explicit
называйте по другому
p51x вне форума Ответить с цитированием
Старый 24.05.2016, 12:08   #3
Katyam
 
Регистрация: 24.05.2016
Сообщений: 7
По умолчанию

Спасибо, переименовала. Потом ругался, что не объявлен массив. Стала передавать его в функции (методы). Появились новые ошибки.



Как я поняла, компилятор ругается на то, что не задан размер массива. Но он ведь задан: считается в main...

PHP код:
#include <iostream> 
#include <math.h> 
#include <cmath> 

using namespace std

void yav (double hdouble tauint Ndouble Tdouble alphadouble betadouble kint ldouble explic[l][N]); 
void neyav (int Ndouble Tdouble alphadouble betadouble kdouble hdouble tauint l); 
void tochn (double alphadouble betadouble kdouble pidouble taudouble hint Ndouble T); 

int main() 

    
double pi=3.14159265358979323846
    
double htautiming=0t=0
    
double Talphabeta
    
int kN

    
cout << "Введите разбиение по x: "
    
cin >> N

    
cout << "Введите конечное время: "
    
cin >> T

    
cout << "Введите коэффициент левого гр. усл.: "
    
cin >> alpha

    
cout << "Введите коэффициент правого гр. усл.: "
    
cin >> beta

    
cout << "Введите коэффициент начального условия u(x,0)=sin(pi*k*x): "
    
cin >> k

    
//посчитали шаг по x 
    
h=1.0/N
    
cout << "h=" << << ", "

    
//посчитали шаг по t 
    
tau=h*h/2
    
cout << "tau=" << tau << endl
     
    
double Massiv
    
Massiv=T/tau//сколько будет слоев, чтобы знать размерность массива 
    
int l = (int)round(Massiv+0.5); 
    
// cout << l <<endl; 

    //массивы, где будут записаны все слои каждого метода 
    
double explic[l][N]; 
    
double impl[l][N]; 
    
double ex[l][N]; 

    
neyav(htauNTalphabetakl); 


    
cout << "Введите номер слоя для явного метода: "
    
cin >> l
    for (
int i=0<= Ni++) 
    { 
      
cout << "Явный метод:" << explic[l][i] << endl
    } 

    return 
0


//ЯВНАЯ СХЕМА 
void yavn (double hdouble tauint Ndouble Tdouble alphadouble betadouble kint l) { 
  
double pi=3.14159265358979323846
  
double timing=0
  
double u0[N], u[N]; 
  
int z=0//счетчик слоя 

  //нулевой слой 
  
cout << endl
  
cout << "• " << << " СЛОЙ" << " ⟶   "

  
//начальные условия 
  
for (int i 0<= Ni++) 
  { 
    
u0[i]=sin(pi*k*i*h); 
    
explic[0][i]=u0[i]; 
    
cout <<u0[i] << ",  "
  } 

  
//переопределяем значения на границах нулевого слоя 
  
u0[0]=0// u=a*t 
  
u0[N]=0// u=b*t 

  
cout << endl
  while(
timing<T
  { 
    
timing timing+tau
    
z=z+1
    
l=z

    for (
int i 0<= Ni++) 
    { 
      
u[i]=u0[i]+(timing/(h*h))*(u0[i+1]-2*u0[i]+u0[i-1]); 
      
explic[l][i]=u[i]; 
    } 
    
u[0]=alpha*timing
    
u[N]=beta*timing
    
explic[l][0]=u[0]; 
    
explic[l][N]=u[N]; 


    
cout<< "СЛОЙ=" << << endl
    for (
int i 0<= Ni++) 
    { 
      
cout << u[i] << ",  "
    } 

    for(
int i 0<= Ni++) 
    { 
       
u0[i] = u[i]; 
    } 
    
cout << endl
  } 



//НЕЯВНАЯ СХЕМА 
void neyav (int Ndouble Tdouble alphadouble betadouble kdouble hdouble tauint l) { 
  
double pi=3.14159265358979323846
  
double timing=0t=0
  
double u0[N], u[N]; 
  
double abc//коэффициенты в системе 
  
double Ai[N],Bi[N]; //массивы коэффициентов 
  
int z=0//счетчик слоя 

  //нулевой слой 
  
cout << endl
  
cout << "СЛОЙ=" << << endl
  
cout << "• " << "U0i: "

  
//начальные условия 
  
for (int i 0<= Ni++) 
  { 
    
u0[i]=sin(pi*k*i*h); 
    
// cout <<u0[i] << ",  "; 
  


  
//переопределяем значения на границах нулевого слоя 
  
u0[0]=0// u=a*t 
  
u0[N]=0// u=b*t 

  //выводим нулевой слой 
  
cout << " " << endl
  
cout << "C учетом граничных" <<endl
  
cout << "• " << "U0i: "
  for (
int i 0<= Ni++) 
  { 
    
cout << u0[i] << ",  "
  } 

  
//коэффициенты системы 
  
cout << endl
  
a=(-1.0)*((2.0/(h*h)+1.0/tau)); 
  
cout << "• " << "a:  " << << ",  "
  
b=1.0/(h*h); 
  
cout << "b:  " << << ",  "
  
c=(-1.0)/tau
  
cout << "c:  " << << endl

  
cout << endl
  while(
timing<T
  { 
    
timing timing+tau
    
z=z+1
    
l=z

    
//A1 и B1 
    
Ai[1]=-b/a
    
Bi[1]=(c*u0[1]-b*alpha*timing)/a

    
//Ai и Bi 
    
for (int i 1<= N-3i++) 
    { 
      
Ai[i+1]=-b/(b*Ai[i]+a); 
      
Bi[i+1]=(c*u0[i+1]-b*Bi[i])/(b*Ai[i]+a); 
    } 

    
//An-1 и Bn-1 
    
Ai[N-1]=0
    
Bi[N-1]=(c*u0[N-1]-b*beta*timing)/(b*Ai[N-2]+a); 

    
//Прогонка 
    
u[0]=alpha*timing
    
u[N-1]=Bi[N-1]; 
    
u[N]=beta*timing
    
impl[l][0]=alpha*timing
    
impl[l][N-1]=Bi[N-1]; 
    
impl[l][N]=beta*timing

    for (
int i=1i<=N-2;i++) 
    { 
      
u[N-i-1]=Ai[N-i-1]*u[N-i]+Bi[N-i-1]; 
      
impl[l][N-i-1]=u[N-i-1]; 
    } 

    
cout << endl

    
//Выводим решение 
    
cout << "СЛОЙ=" << << endl
    
cout << "• " << "Ui" << " ⟶   "
    for (
int i=0i<=Ni++) 
    { 
       
cout << u[i] << ",  "
    } 

    
//Печатаем прогоночные коэффициены А 
    
cout << "• " << "Аi" << " ⟶   "
    for (
int i=1i<=N-1i++) 
    { 
      
cout <<Ai[i] << ",  "
    } 

    
//Печатаем прогоночные коэффициены B 
    
cout << endl
    
cout << "• " << "Bi" << " ⟶   "
    for (
int i=1i<=N-1i++) 
    { 
      
cout <<Bi[i] << ",  "
    } 

    
//Запоминаем этот слой 
    
for(int i 0<= Ni++) 
    { 
       
u0[i] = u[i]; 
    } 

    
cout << endl

  } 



//ТОЧНОЕ РЕШЕНИЕ 
void tochn (double alphadouble betadouble kdouble pidouble taudouble hint Ndouble Tint l) { 
  
double homogeneousinhomogeneoustiming=0
  
double u[N]; 
  
int n=10

  while (
timing<T) { 

    for (
int i=0i<=Ni++) 
    { 
      
//решение однородного уравнение (𝛏't=𝛏''xx) 
      
homogeneous=alpha*timing*(1-h*i)+beta*timing*h*i+(exp(-pow(pi*k,2)*timing))*sin(pi*k*h*i); 

      
//решение неоднородного уравнение (𝛈't=𝛈''xx - 𝛍...) 
      
for(int j=1j<=nj++) 
      { 
        
inhomogeneous=inhomogeneous+(2/(pow(pi*j,3)))*(alpha-(pow(-1j))*beta)*sin(pi*j*h*i)*(exp(-pow(pi*j,2)*timing)-1); 
      } 
      
u[i]=homogeneous+inhomogeneous
      
u[0]=alpha*timing
      
u[N]=beta*timing
      
ex[l][0]=u[0]; 
      
ex[l][N]=u[N]; 

      
cout << u[i] << " "
    } 
    
timing=timing+tau
    
l=l+1
  } 

Katyam вне форума Ответить с цитированием
Старый 24.05.2016, 15:34   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Сделайте по примеру:


http://itedu.ru/faq/kak-peredat-v-fu...nyy-massiv-v-c
ura_111 вне форума Ответить с цитированием
Старый 25.05.2016, 10:29   #5
Katyam
 
Регистрация: 24.05.2016
Сообщений: 7
По умолчанию

Спасибо! Помогло.
Katyam вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос о приоритете скорости разными методами отправки в базу данных Jleksern PHP 6 05.09.2013 14:28
Решение трехмерного уравнения теплопроводности E90 Помощь студентам 2 08.08.2012 21:44
Разностное решение уравнения теплопроводности.Явный метод(Delphi) Helene Lee Помощь студентам 0 27.05.2012 21:16
Вычисление опред.интеграла разными методами(С++) Knok69 Помощь студентам 0 08.05.2010 20:29
Решения одномерного дифференциального уравнения теплопроводности в частных производных (delphi) Denzloy Помощь студентам 1 27.01.2009 14:51