Szukanie minimum Newton. Problem

0

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

0
  1. raczej nie chodziło o to by wpisać w program funkcję razem z jej pochodnymi, miałeś raczej numerycznie policzyć pierwszą i drugą pochodną.

  2. czy na pewno dobrze wpisałeś te pochodne? Jak je policzyłem to mi wyszło:
    f'(x)=-2\pi ,{\left( -1\right) }<sup>{k_1},n_2,sin\left( 2\pi ,n_2,x) +2\pi ,n_1,cos\left( 2\pi ,n_1,x) +a,sign,x-k_2,{e}</sup>{-k_2,x}
    f''(x)=-4{\pi }<sup>2,{\left( -1\right) }</sup>{k_1},{n_2}<sup>2,cos\left( 2\pi,n_2,x) -4\pi</sup>2,{n_1}<sup>2,sin\left( 2\pi,n_1,x) +{k_2}</sup>2,{e}^{-k_2,x}

  3. Cześć odpowiedzialna za metodę Newtona wygląda dobrze.

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