[C++] Metoda Newton'a. Pierwiastek.

Yoooj
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 25 lis 2010, o 17:01
Płeć: Mężczyzna
Lokalizacja: Bielsko
Podziękował: 2 razy

[C++] Metoda Newton'a. Pierwiastek.

Post autor: Yoooj »

Witam Serdecznie.

Zadanie jest następujące:

Mając dany \(\displaystyle{ EPSILON = 0.0001}\), Funkcję: \(\displaystyle{ b \cdot \ln (x)-1=0}\) oraz przedział: \(\displaystyle{ x=\left\langle 1,2\right\rangle}\).
Mam do policzenia ilość literacji oraz pierwiastek.

To co do tej pory udało mi się zrobić to:

Kod: Zaznacz cały

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

	double x=1; // Zmienna x

	double E = 0.0001; // Dokładność
	
	double xp=x; // Poprzednia zmienna
	double z=x*log(x)-1; // Wynik


	double f(double x)
	{
		return x*log(x)-1;
	}

	double fp(double x) // Pochodna Funkcji
	{
		return log(x) +1;
	}

int main()
{
	// x*lnx -1 =0
	// x = <1, 2>

	cout << "Podaj x: ";
	cin >> x;

	double E = 0.0001; // Dokładność
	
	cout << "Wynik= " << z;

	int i;
	
	// i = ilość literacji
	for (int i=0; abs(x-xp)<E; i++)
	{
		z=f(x);
		if (z==0)
		{
		z= sqrt(z);
		cout << z;
		}
	
		xp = x;
		x= x - (f(x)/fp(x));
			
	}
		cout << x << endl;
		cout << E << endl;
		cout << i << endl;
	        cout << "Wynik= " << z;
		return 0;
}
Zdaję sobie sprawę, że coś mi umknęło. Po prostu utknąłem w martwym[?] punkcie i nie wiem co dalej . Proszę o jakąkolwiek pomoc . Z góry Dziękuję.

Pozdrawiam.-- 14 paź 2012, o 00:04 --Dobra... Zignorujcie pierwszy post. Straszne głupoty... Udało mi się doprowadzić program do końca:
// Metody1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

double Funkcja(double x) // Funkcja
{
return x*log(x)-1;
}

double PochFunkcji(double x) // Pochodna Funkcji
{
return log(x) +1;
}

int main()
{
double a=0, b=0, Pierwiastek=0, e=0;

// gdzie;
// a - Początek przedziału.
// b - koniec przedziału.
// e - EPSILON - Dokładność.

cout << "Prosze podac poczatek przedzialu: ";
cin >> a;

cout << "Prosze podac koniec przedzialu: ";
cin >> b;

cout << "Prosze podac dokladnosc: ";
cin >> e;

int Licznik=0;

if (Funkcja(a) == 0)
{
Licznik++;
Pierwiastek = Funkcja(a);
}

if (Funkcja(b) == 0)
{
Licznik++;
Pierwiastek = Funkcja(b);
}

else
{
for (double i=a; abs(b-a)>e;)
{
Pierwiastek = a - ( Funkcja(a) / PochFunkcji(a) );
b=a;
a=Pierwiastek;
Licznik++;
}
}
cout << endl << "Pierwiastkiem tego rownania jest: " << Pierwiastek << " " << "z dokladnoscia rowna: " << e << endl;

cout << "Literacje: " << Licznik << endl;
return 0;
}
Ostatnia Prośba: Czy może ktoś przetestować ten kod? Czy nie ma w nim jakiś głupich błędów... itd? Z góry dziękuje. Głównie chodzi mi o sprawdzenie ilości literacji.
Ostatnio zmieniony 13 paź 2012, o 10:55 przez Afish, łącznie zmieniany 3 razy.
Powód: Wyrażenia matematyczne umieszczaj w tagach [latex] [/latex].
ODPOWIEDZ