Witam. Piszę w C++ program, który ma za zadanie policzyć pochodną pierwszą i drugą w danym punkcie korzystając z numerycznej metody operatora różnic wstecznych
#include<iostream>
#include<cmath>
using namespace std;
double funkcja(double x)
{
return log(x);
}
int main()
{
double x0,h=0.1;
int n;//ilosc przedzialow
//tablica roznic wstecznych
double **nabel=new double *[n];
for(int i=0;i<n;i++)
{
nabel[i]=new double[n];
}
char znak;
double *p1=new double [n];
// double *p2=new double[n];
cout<<"Podaj wartosc x0 dla ktorego zostanie policzona wartosc pochodnej funkcji"<<endl;
cin>>x0;
cout<<"Podaj ilosc przedzialow n: "<<endl;
cin>>n;
for(int i=0;i<n;i++) //i:wiersze, j:kolumny
{
nabel[i][0]=funkcja(x0 - i*h);
cout<<nabel[i][0]<<endl<<endl;
}
int temp=n;
for(int j=1;j<=n-1;j++)
{
for(int i=0;i<(temp-1);i++)
{
nabel[i][j]=nabel[i][j-1]-nabel[i+1][j-1];
}
--temp;
}
for(int i=0;i<=n-1;i++)
{
for(int j=0;j<=n-1;j++)
{
cout<<nabel[i][j]<<"\t";
}
cout<<endl;
}
cout<<endl<<endl;
for(int j=1;j<=n-1;j++)
{
p1[j]=p1[j-1]+nabel[0][j]/j;
}
p1[4]/=h;
cout<<"Wartosc pochodnej funkcji w punkcie "<<x0<<" wynosi: "<<p1[4]<<endl;
for(int i=0;i<n;i++)
{
delete [] nabel[i];
}
delete [] nabel;
delete [] p1;
// delete []p2;
// system("PAUSE");
return 0;
}
Jeśli zakomentuję deklarację dynamicznej tablicy p2 (tak jak w wklejonym kodzie) wszystko kompiluje się poprawnie i nie ma problemu,program działa jak należy. Gdy chcę obliczyć drugą pochodną, deklaruję tablicę p2 i podczas kompilacji terminal wypluwa mi "Naruszenie ochrony pamięci(core dumped)". Czytałem już na wielu stronach o tym problemie, ale nie rozumiem co jest nie tak, wydaję mi się że nie przekraczam dozwolonej pamięci. Próbowałem ustawiać różne rozmiary tablicy, np.
double *p2=new double[3]
i błąd mimo wszystko się pojawia. Dodam,że pracuję na Linuxie. Kompilując ten kod na Windowsie kompilator kończy działanie. Ktoś wie jak sobie z tym poradzić?