Witam. Mam problem z programem szukającym minimum algorytmem Newtona(chodzi o algorytm z liczeniem pochodnej pierwszego i drugiego rzedu). Próbowałem już robić wszystko co tylko mogłem, żeby działał poprawnie niestety wciąż nie mogę dojść dlaczego pętla jest nieskończona. Funkcja dla której mam liczyć minimum to:
f(x) = f1(x) + f2(x) + f3(x)
f1(x) = sin(2pin1x) + (-1)^k1*(cos(2pin2x))
f2(x) = exp(-k2x)
f3(x) = a|x|
a,n1,n2,k1,k2 stałe
Program:
//#include <cmath>
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;
//--------------------------------------
//Zmienne globalne
//--------------------------------------
double PI=3.14159265358979323846;
int N1=9;
int N2=6;
double a=0.1111111111111111111;
int n1=(N1%3)+1;
int n2=(N2%3)+1;
int k1=(N1%2)+1;
int k2=(N2%2)+1;
//--------------------------------------
//Pierwsza pochodna
//--------------------------------------
double fp(double x)
{
//2*PI*n1*cos(2*PI*n1*t) - 2*(-1)^k1*sin(2*PI*n2*t)*PI*n2
double pom,potega,liczba;
double fp1,fp2,fp3,fp;
liczba=(-1);
potega=k1*sin(2*PI*n2*x)*PI*n2;
pom=pow(liczba,int(potega));
fp1=(2*PI*n1*cos(2*PI*n1*x))-(2*pom);
fp2=(-k2)*exp(-k2*x);
fp3=a*0;
fp=fp1+fp2+fp3;
return fp;
//return 1.0;
}
//--------------------------------------
//Druga pochodna
//--------------------------------------
double fpp(double x)
{
double fpp1,fpp2,fpp3,fpp,buf;
double fppp,liczba, potega;
buf=pow(PI,2); //PI^2
potega=k1*(buf*cos(2*PI*n2*x));
liczba=(-1);
fppp=pow(liczba,(int)potega); //równianie pomocnicze
//-4*sin(2*PI*n1*t)*PI^2*n1^2 - 4*(-1)^k1*cos(2*PI*n2*t)*PI^2*n2^2
fpp1=(-4)*sin(2*PI*n1*x)*buf*(n1^2)-(4*fppp);
fpp2=(k2^2)*exp(-k2*x);
fpp3=0;
fpp=fpp1+fpp2+fpp3;
return fpp;
}
//--------------------------------------
//Program glówny
//--------------------------------------
int main()
{
double eps, xnew, xold;
int i=0;
eps=0.0000000001;
cout << "Podaj wartosc startowa, x0= ";
cin >> xnew;
while (abs(fpp(xnew))<eps || abs(fpp(xnew))==0)
{
cout <<"Niewlasciwy punkt startowy" <<endl;
cout <<"Podaj ponownie punkt startowy" <<endl;
cin >>xnew;
printf ("\n");
}
do{
xold = xnew;
xnew = xold - ( fp(xold)/fpp(xold) );
cout << "kolejne przybliżenie = " << xnew << endl;
i++;
if (i>1000)
{
cout <<"Petla nieskonczona" <<endl;
cout <<"Koniec dzialania programu" <<endl;
system("pause");
exit(1);
}
}
while(abs(xnew-xold)>=eps);
cout << "Wynik = " << xnew << endl;
system("pause");
exit(1);
return 0;
}
</cpp>
Program napisany w Visual 2005. Jeśli ktoś miałby pomysł co w tym programie jest nie tak... będę wdzięczny za wszelką pomoc