cpp równanie laplacea a poissona

0

witam, mam program liczący równanie Laplace'a , teraz na jego podstawie mam obliczyć równanie Poissona ze źródłem, które jest dane <ort>d2/dx2+d2/dy2=6xy(1-y)-2x^3 </ort>

a kod liczący Laplacea mam taki:

 const  float pi = 3.14;

const int terms = 100;

const int  L =1;
const float step = 0.01; // krok
const float xo = 0.0;
const float yo = 0.0;

int rozmiar = L/step;

double analityczne (double x, double y, int koniec )
{
    double suma = 0.0;
       
    for(int n = 1;n <= koniec;n += 2)
    {
        suma += ((400.0)/(pi*n)) * sin(n*pi*x/L) * sinh(n*pi*y/L)/sinh(n*pi); 
    }            
   return suma;    
}       

main()
{  
   ofstream dane;
   ofstream analt;
   
   dane.open("obliczenia.txt");
   analt.open("analitycznie.txt");
      
   double macierzK [rozmiar+1][rozmiar+1];
   double macierzP [rozmiar-1][rozmiar-1];
   double macierzA [rozmiar+1][rozmiar+1];
   
   for(int i = 0; i < rozmiar+1; ++i)
   {  
      for(int j = 0; j < rozmiar+1; ++j)
      {  
         if ((i == rozmiar))     
         {
           macierzK[i][j] = 0.0;
         }
         
         else
         {
           macierzK[i][j]=0.0; 
         }    
              
      }        
      
   } 
   
   for(int i = 0; i < rozmiar + 1; ++i)   
   {  
      for(int j = 0; j < rozmiar + 1; ++j)
      {
         macierzA[i][j] = 0;     
      }
   }             
              
   
   for(int i = 0; i < rozmiar + 1; ++i)    // wyniki analityczne
   {  
      for(int j = 0; j < rozmiar + 1; ++j)
      {  
          macierzA[i][j] = analityczne(xo + i*step,yo + j*step,terms);
      }
      
   }              
   
   // METODA GAUSSA SEIDLA
   
   for(int k = 1; k <= iter;++k)
   {
   for(int i = 1; i < rozmiar ; ++i)
   {  
      for(int j = 1; j < rozmiar ; ++j)
      {  
         macierzK [i][j] = ( macierzK[i-1][j] + macierzK[i+1][j] + macierzK[i][j-1] + macierzK[i][j+1] )/4;
              
      }    
      
   }   
   
     if(k == iter - 1)
     {
        for(int i = 0; i < rozmiar - 1; ++i)
        {
           for(int j = 0; j < rozmiar - 1; ++j)         
           {
             macierzP[i][j] = macierzK[i+1][j+1];      
           }            
        }     
     
     }     
            
    
   }
   
   
   for(int i = 0; i < rozmiar - 1; ++i)   // zmiany potencjalu 
   {  
       int l = 1;    // deklaruję pomocniczą zmienną 
           
      for(int j = 0; j < rozmiar - 1; ++j)
      {
         if((macierzK[i+1][j+1] - macierzP[i][j]) > eps)
         {
           cout<<"zwiekszyć dokladnosc"<<endl;
           l = 0;
         }  
         break;     
      }
         if(l ==0)
         break;
   }          
    
   cout<<endl;
   cout<<endl;
     
   for(int i = 0; i < rozmiar+1; ++i)   
   {  
      for(int j = 0; j < rozmiar+1; ++j)
      {     
        
        dane<<"{"<<xo + i*step <<","<<yo + j*step<<","<<macierzK[i][j]<<"},"<<endl;
        
      }
      
      cout<<endl;
      
   }  
   
   cout<<endl;
   cout<<endl;
   
   for(int i = 0; i < rozmiar+1; ++i)   
   {                                  // wyniki analityczne
      for(int j = 0; j < rozmiar+1; ++j)
      {     
        
        
        analt<<"{"<<xo + i*step<<","<<yo + j*step<<","<<macierzA[i][j]<<"},"<<endl;
      }
      
      cout<<endl;
      
   }  
         
   
   cout<<endl;
   cout<<endl;
     
   for(int i = 0; i < rozmiar - 1; ++i)   // wyniki pomocnicze
   {  
      for(int j = 0; j < rozmiar - 1; ++j)
      {     
        
      }
      
      cout<<endl;
      
   }   
   
   cout<<endl;
     
      
 getch();
 dane.close();
 analt.close();
      
}      





jak teraz zmodyfikować ten kod by ująć źródło?

0

Forum wspiera tex-a:
(\frac{d<sup>2}{dx</sup>2}+\frac{d<sup>2}{dy</sup>2})f(x)=6 x  y (1-y)-2 x^3

Co do samego problemu to: patrz wiki (funkcje greena)

1 użytkowników online, w tym zalogowanych: 0, gości: 1