Mógłby ktoś mi pomóc i uswiadomić w którym miejcu i w jaki sposób zadeklarowac funkcję v9x,y0=6xy(1-y)-2x^3 i
i warunki brzegowe dla x=0 : alfa 1=1, beta1=0, gamma1=0, a dla x=1 alfa2=1, beta2=0, i gamma2=y(1-y).
Kod rozwiązywania rówananie Piossona 2d mam następujący
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int L;
vector< vector<double> > psi; // potencjał
vector< vector<double> > rho; //gęstośc ładunku- podana
double h; // krok h
vector< vector<double> > psiNew; // potencjał po każdym nowym kroku
int steps; // liczba iteracji
double accuracy; // dokładność
void initialize() {
// tworzenie macierzy
int N = L + 2; // punkty wewnętrzne i dwa warunki brzegowe
psi = psiNew = rho
= vector< vector<double> >(N, vector<double>(N, 0.0));
h = 1 / double(L + 1); // założenie wymiaru x,y=1
double q = 10; // point charge
int i = L / 2; // środek siatki
rho[i][i] = q / (h * h); // gęstośc ładunku
steps = 0;
}
void Jacobi() {
// Metoda Jacobiego dla pojedynczej iteracji
for (int i = 1; i <= L; i++)
for (int j = 1; j <= L; j++)
psiNew[i][j] = 0.25 * (psi[i - 1][j] + psi[i + 1][j] +
psi[i][j - 1] + psi[i][j + 1] +
h * h * rho[i][j]);
}
double relativeError() {
double error = 0; // średni błąd
int n = 0; // liczba niezerowych różnic
for (int i = 1; i <= L; i++)
for (int j = 1; j <= L; j++) {
if (psiNew[i][j] != 0)
if (psiNew[i][j] != psi[i][j]) {
error += abs(1 - psi[i][j] / psiNew[i][j]);
++n;
}
}
if (n != 0)
error /= n;
return error;
}
void GaussSeidel() {
// copy psi to psiNew
for (int i = 1; i <= L; i++)
for (int j = 1; j <= L; j++)
psiNew[i][j] = psi[i][j];
// Gauss-Seidel update
for (int i = 1; i <= L; i++)
for (int j = 1; j <= L; j++)
psiNew[i][j] = 0.25 * (psiNew[i - 1][j] + psiNew[i + 1][j] +
psiNew[i][j - 1] + psiNew[i][j + 1] +
h * h * rho[i][j]);
}
void iterate(void (*method)()) {
while (true) {
method();
++steps;
double error = relativeError();
if (error < accuracy)
break;
vector< vector<double> > swap = psi;
psi = psiNew;
psiNew = swap;
}
cout << " :Liczba kroków = " << steps << endl;
}
int main() {
cout << " Iteracyjne rozwiązanie równania Poissona\n"
<< " ----------------------------------------\n";
cout << " Wprowadź liczbę punktów x i y : ";
cin >> L;
initialize();
cout << " Wprowadź dokładniość ";
cin >> accuracy;
clock_t t0 = clock();
cout << " Wybierz metodę Jacobiego 1 lub Gaussa siedla 2 ";
int choice;
cin >> choice;
switch (choice) {
case 1:
iterate(Jacobi);
break;
case 2:
iterate(GaussSeidel);
break;
default:
cout << " Jacobi: " << endl;
iterate(Jacobi);
cout << " Gauss-Seidel: " << endl;
initialize();
iterate(GaussSeidel);
initialize();
break;
}
clock_t t1 = clock();
cout << " CPU time = " << double(t1 - t0) / CLOCKS_PER_SEC
<< " sec" << endl;
cout << " Potenciał w folderze poisson.data" << endl;
ofstream file("poisson.data");
for (int i = 0; i < L + 2; i++) {
double x = i * h;
for (int j = 0; j < L + 2; j++) {
double y = j * h;
file << x << '\t' << y << '\t' << psi[i][j] << '\n';
}
file << '\n';
}
file.close();
}