wysylam ci nie tylko moj program ale tez specyfikacje bo w niej w sumie
mam wytlumaczone jak to robic (w pierwszym punkcie).
Do naszych programow potrzebujemy jakiejs funkcji, a zeby policzyc jej
min (max) to tez pochodnej (to taka metoda rozwiazywania zadan z
liceum) . I wazna rzecz - program nie za bardzo dziala dla sin/cos wiec
lepiej takich nie bierz (a co za tym idzie tez tg/ctg bo tam pochodne sa
1/cos^2(x) itd). najlepiej byloby chyba gdybys to na jakis wielomianach
zrobil i tyle, bo ja nie mam wiecej pomyslow na jakas dzialajaca funkcje
poza ta moja 2^x - 2x.
Jeszcze jedno: jak ja wywoluje to moja funkcje to pisze: wynik2 =
zero(x1(f2),10,f2); Ta dziesiatka w srodku to moje ogrtaniczenie na
ilosc iteracji (z tresci zadania). moze liepiej by bylo gdybys ty nie
mial tego w ten sposob wprowadzanego , tj mialbys funkcje
double zero(double x1, double f(double)){
double xn;
double ilosc;
int it = 0; //licznik iteracji
xn=x1;
ilosc = 10; <- czyli w swojej funkcji tutaj bys zmienial ilosc iteracji
no i to chyba wszystko.
przy szukaniu maksimum po prostu musiasz sprawdzac czy istnieje cos
wiekszego (jak robie czy istnieje cos mniejszego)
//Agnieszka Kozub zad.72
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#define r 0.1
//funkcja f1
double f1(double x){
return pow(x,4)-1;
}
//funkcja f2
double f2(double x){
return pow(2,x)-2*x;
}
//pochodna funkcji f1
double f11(double x){
return 4*pow(x,3);
}
//pochodna funkcji f2
double f21(double x){
return -2+pow(2,x)*log10(x)/log10(2);
}
//funkcja wyznaczajšca x0
double x1(double f(double x)) {
double pom1, pom2;
pom1=-0.05; pom2=-0.05+r;
while ( (f(pom1))*(f(pom2))>=0 && (f(-pom1))*(f(-pom2))>=0){
pom1 +=r;
pom2 +=r;
}
if((f(pom1))*(f(pom2))<0)
return (pom1+pom2)/2;
else
return (-pom1-pom2)/2;
}
//funkcja wyznaczajšce x0 dla f21
double x2() {
double pom1, pom2;
pom1=0.05; pom2=0.05+r;
while ( f21(pom1)*f21(pom2)>=0 ){
pom1 +=r;
pom2 +=r;
}
return (pom1+pom2)/2;
}
//szukanie x dla którego f(x)=0
double zero(double x1, int ilosc, double f(double)){
double xn;
int it = 0; //licznik iteracji
xn=x1;
while (it<ilosc && f(xn)!=0 ){ //iloć to ograniczenie iloci wykonywanych iteracji
xn= xn- pow(f(xn),2)/(f(xn + f(xn)) - f(xn));
it++;
}
cout << "ilosc wykonanych iteracji: " << it << endl;
return xn;
}
int main(){
double wynik1, wynik2, min1,xm1, min2,xm2;
double pomocnicza;
cout << "Program rozwiazuje rownanie f(x)=0 metoda Steffensena dla dwoch funkcji:"<<endl;
cout << "(1) f(x)= x^4-1" << endl;
cout << "(2) f(x) = 2^x - 2*x" << endl;
cout <<"Oraz szuka najmniejszej wartosci kazdej z funkcji na przedziale [0.5,10]."<<endl << endl;
cout << "Dla funkcji (1): "<< endl ;
wynik1 = zero(x1(f1),10,f1);
cout << "f(x)=0 dla x=" << wynik1 << endl << endl;
//szukanie minimum funkcji f1
min1=f1(0.5);
xm1=0.5;
if(min1>f1(10)){
min1=f1(10);
xm1=10; }
pomocnicza=zero(x1(f11),10,f11);
if(pomocnicza>0.05 && pomocnicza <10){
if(min1>f1(pomocnicza)){
min1=f1(pomocnicza);
xm1=pomocnicza; }
}
cout<< "funkcja przyjmuje minimum w punkcie xmin=" << xm1 << ", f(xmin)=" << min1 << endl;
cout <<endl<< endl << "Dla funkcji (2): "<< endl ;
wynik2 = zero(x1(f2),10,f2);
cout << "f(x)=0 dla x=" << wynik2 << endl << endl;
//szukanie minimum dla funkcji f2
min2=f2(0.5);
xm2=0.5;
if(min2>f2(10)){
min2=f2(10);
xm2=10; }
pomocnicza=zero(x2(),16,f21);
if(pomocnicza>0.05 && pomocnicza <10){
if(min2>f2(pomocnicza)){
min2=f2(pomocnicza);
xm2=pomocnicza; }
}
cout <<"funkcja przyjmuje minimum w punkcie xmin=" << xm2 << ", f(xmin)=" << min2 << endl;
return 0;
}
Programy (28-01-2008 22:18)
//wyliczenie węzłów rownoleglych
double krok=0;
if (n>1) krok=2.0/(double)(n-1);
for (i=0;i<n;i++)
tab[i][0]=-1 + i*krok;
if (n==1) tab[0][0]=0;
Programy (28-01-2008 22:19)
tu jest wyprowdzanie wezłów rownoleglych
Programy (28-01-2008 22:19)
krok to odleglosc miedzy wezlami
Micik (28-01-2008 22:19)
no no jak mialbys chwilkie to tak wiesz lopatologicznie bym prosil zeby sie nie przyjebala juz do tego iwecej:)
Programy (28-01-2008 22:20)
np dla 5 wezlow bedzie wynosił 2 (przedział od -1 do 1) / (5-1) = 2/4 = 0.5
Programy (28-01-2008 22:20)
i zaczynamy od -1
Programy (28-01-2008 22:20)
i co 0.5 oznaczamy wezel
Programy (28-01-2008 22:20)
czyli -1 , -0.5 , 0 , 0.5 , 1
Programy (28-01-2008 22:20)
i mamy 5 wezlow
Micik (28-01-2008 22:21)
okej okej
Programy (28-01-2008 22:21)
jesli n=1 to mamy tylko jeden wezel w 0 <--- to jest [rzypadek szczegolny
Programy (28-01-2008 22:21)
wezly jasne?
Micik (28-01-2008 22:23)
tak wezle te jasne a powiedz mi jeszcze bo tutaj jest ustawiony krok
Micik (28-01-2008 22:23)
a w czybyszewie tez jest taki sam krok jak tutaj tak
Micik (28-01-2008 22:23)
bio przedzialy sa takie same
Programy (28-01-2008 22:24)
tam w czebyszewie jest chyba zmienny krok zwiazany z sin czy csinusem
Programy (28-01-2008 22:24)
nie wiem tam nie wnikalem za bardzo po prostu jechalem tego czebyszewa ze wzoru z tresci zadania
Micik (28-01-2008 22:24)
aha okej okej
Programy (28-01-2008 22:25)
jakby krok byl staly to tez by byly rownolegle wtedy :P
Micik (28-01-2008 22:25)
bo wlasnie jak tam wezem przedzial od -1 do 1 i w rownoodleglych ty w tych samych X liczy
Programy (28-01-2008 22:25)
for (i=0;i<n;i++)
tab[i][0]=cos(((double)(2*(i+1)-1)/(double)(2*(n))) * PI);
Programy (28-01-2008 22:25)
tam jest taki wzor dany wiec nie ma co filozofowac :) a że opisany cosinusem to tez nie wyjedzie poza zakres -1 do 1
Micik (28-01-2008 22:26)
no tak ale te X sa takie same znaczy jak biore przedzial -1 1 to mam wiesz np. i tu i tu x=-0.9 -0.8 -0.7 i tak dalej
Programy (28-01-2008 22:26)
nie nie
Programy (28-01-2008 22:26)
tam na koniec to jest po prostu dla niektorych wartosci z tego przedzialu a do b zrobione
Programy (28-01-2008 22:27)
znaczy na koniec t ojuz tylko wypisuje wyniki przykladowe
Programy (28-01-2008 22:27)
podajesz a do b
Programy (28-01-2008 22:27)
i on Ci wypisuje wyniki dla x co 0.1
Programy (28-01-2008 22:27)
bo tam w sumie nie jest powiedziane ze dla wezlow ma wypisywac
Programy (28-01-2008 22:27)
sam nie wiem jak to ma byc zorganizowane
Micik (28-01-2008 22:28)
no wlasnie ale to nie sa te wezle tylko wypisuje mi dla x co 0.1 znaczy ze ten X to jest jakis punkt czy wezel
Programy (28-01-2008 22:28)