algorytm.org

Implementacja w C/C++

Pomoc
Potrzebujesz algorytmu/kodu źródłowego, którego nie znalazłeś(aś) w serwisie?
Zamów algorytm!
Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Metoda siecznych - Implementacja w C/C++
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 08 sierpnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

sieczne_c.c:
//Metoda Siecznych
//www.algorytm.org
//Tomasz Lubinski (c)2001

#include <stdio.h>
#include <conio.h>
#include <math.h>


int n,p,q;
float a[100];


float w(int k, float x) //algorytm Hornera - obliczanie wartosci wielomianu
{
if (k==n)
{return a[n];}
else
{return w(k+1,x)*x+a[k];}
}

float s(int j)           //algorytm Show-Trauba funkcja pomocnicza s(j)
{
return (n-j)%q;
}

float r(int j)           //algorytm show-Trauba funkcja pomocnicza r(j)
{
if (j%q==0)
return q;
else
return 0;
}

float T(int i, int j, float x) //Algorytm Show-Trauba - glowna funkcja
{
if (x==0)                     //by mozna bylo obliczyc pochodna w punkcie x=0
return a[j];
else
if (j==-1)
return a[n-i-1]*pow(x,s(i+1));
else
if (i==j)
return a[n]*pow(x,s(0));
else
return T(i-1, j-1, x)+T(i-1, j, x)*pow(x,r(i-j));
}

float pochodna(int stopien, float punkt)
{
if (punkt==0) return T(n,stopien,punkt); else return T(n,stopien,punkt)/pow(punkt,stopien%q);
}



main()
{
int k,l;
float y,z,c,d,e;
clrscr();
printf("Metoda Siecznych - obliczanie zer funkcji nieliniowych\nna przykladzie wielomianow\nPodaj stopien wielomianu\n");
scanf("%d", &n);
if (n>100)
{printf("Za duzy stopien wielomianu"); getche(); return(1); }
if (n<2)
{printf("Za maly stopien wielomianu"); getche(); return(1); }


printf("\nPodaj teraz kolejne wspolczynniki wielomianu.\nZaczynij od tego z najwieksza potega.\n");
for(k=n; k>=0; k--)
 {printf("a%d ", k);
  scanf("%e", &a[k]);}

printf("Podaj poczatek przedzialu\n");
scanf("%e",&y);
printf("Podaj koniec przedzialu\n");
scanf("%e",&z);
if (z<y) {printf("Koniec przedzialu jest mniejszy od poczatku"); getche(); return(1);}
printf("Podaj liczbe iteracji\n");
scanf("%d",&l);
p=1; q=n+1;

 if ((pochodna(1,y)*pochodna(2,y))<0) //pierwsze dwa przyblizenia z regula falsi
  {c=z; c=c-(w(0,c)/(w(0,y)-w(0,c)))*(y-c);}
 else
  {c=y; c=c-(w(0,c)/(w(0,z)-w(0,c)))*(z-c);}

 for (k=1; k<l-1; k++)
  {if ((w(0,c)==0)||((w(0,c)-w(0,d))==0)) {break;}
   e=c; c=c-((w(0,c)*(c-d))/(w(0,c)-w(0,d))); d=e;}

if (w(0,c)==0) {printf("Dokladny pierwiastek wynosi %f",c);}
else {printf("Przyblizony pierwiastek wynosi %f",c);}

getche();
return(0);
}

Komentarze
photo
0 # John 2015-11-07 18:29
Wszystko fajnie tylko trzeba zwrócić uwagę na numeracje tablicy. W algorytmie mamy a[n-i-1] co daje nam dla i=0 i n=3 a[2]. Niestety potrzebujemy wartość a[1] gdyż normalny algorytm numeruje współczynniki przy pochodnych od najmniejszej do największej a my na odwrót.
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz