Advertisement
Guest User

Untitled

a guest
May 5th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. using namespace std;
  5. typedef double(*userFuncPtr)(double);
  6.  
  7. /* FUNKCJE UZYTKOWNIKA */
  8. double user_function1(double x){
  9. return pow(x-2.0f,2) - 25.0f;
  10. }
  11.  
  12. double user_function2(double x){
  13. return (x-5)*(x-3)*x*(x+10);
  14. }
  15.  
  16. double user_function3(double x){
  17. return pow(x, 4) - 625.0f;
  18. }
  19.  
  20.  
  21. double derivateIn(double x0, double h, int nNable, userFuncPtr func, int n);
  22. void metoda_siecznych(double a, double b, double eps, userFuncPtr func, double *out);
  23. void metoda_stycznych(double a, double b, double eps, userFuncPtr func, double *out);
  24. void metoda_bernoulliego(int n, const double * a_i_vec, double eps, userFuncPtr func);
  25.  
  26. int main(){
  27. const double A = -10.0f;
  28. const double B = -1.0f;
  29. const double EPS = 0.0001;
  30. double out;
  31.  
  32. cout<<"Metoda siecznych:"<<endl;
  33. metoda_siecznych(A, B, EPS, &user_function3, &out);
  34.  
  35. cout<<"\n\nMetoda stycznych:"<<endl;
  36. metoda_stycznych(A, B, EPS, &user_function3, &out);
  37.  
  38.  
  39. double a_i_vec[] = {1.0f, -18.0f, -65.f, 150.0f, 0.0f};
  40. cout<<"\n\nMetoda Bernoulliego:"<<endl;
  41. metoda_bernoulliego(4, a_i_vec, EPS, &user_function2);
  42.  
  43. system("pause");
  44. return 0;
  45. }
  46.  
  47. void metoda_bernoulliego(int n, const double *a_i_vec, double eps, userFuncPtr func){
  48.  
  49. double y_i;
  50. double *y_b = new double[n*1000];
  51. memset(y_b, 1, sizeof(double)*n);
  52.  
  53. double fac = 0;
  54. /*
  55. do{
  56. for(int i = 0; i<(n-1); i++)
  57. //fac += a_i_vec[i+1]
  58.  
  59. y_i = (-1.0f/a_i_vec[0]);
  60. }while( (1.0f) > eps);
  61. */
  62. //horner
  63.  
  64.  
  65. delete [] y_b;
  66. }
  67.  
  68. void metoda_stycznych(double a, double b, double eps, userFuncPtr func, double *out){
  69. if(func(a)*func(b) > 0.0f){
  70. cout<<"W tym przedziale nie ma pierwiastkow!\n";
  71. return;
  72. }
  73.  
  74. double deriv2A, deriv2B; // 2 pochodne w a i b
  75. double x = 0;
  76. int counter = 0;
  77.  
  78. deriv2A = derivateIn(a, 0.001, 3, func, 2);
  79. deriv2B = derivateIn(b, 0.001, 3, func, 2);
  80.  
  81. cout<<"Drugie pochodne:"<<deriv2A<<" "<<deriv2B<<endl;
  82.  
  83. double x_i;
  84.  
  85. if( (func(a)*deriv2A) > 0.0f ){
  86. x_i = a;
  87. }else if( (func(b)*deriv2B) > 0.0f ){
  88. x_i = b;
  89. }
  90.  
  91. do{
  92. x_i = x_i - func(x_i)/(derivateIn(x_i, 0.001, 3, func, 1));
  93. cout<<"iteracja["<<counter<<"]: x_i = "<<x_i<<" wartosc func:"<<func(x_i)<<endl;
  94. counter++;
  95. }while( fabs(func(x_i)) > eps);
  96.  
  97. }
  98.  
  99.  
  100.  
  101. /* ------------ NIELONIOWE ROWNANIA ------------*/
  102.  
  103.  
  104.  
  105. void metoda_siecznych(double a, double b, double eps, userFuncPtr func, double *out){
  106. if(func(a)*func(b) > 0.0f){
  107. cout<<"W tym przedziale nie ma pierwiastkow!\n";
  108. return;
  109. }
  110.  
  111. double deriv2A, deriv2B; // 2 pochodne w a i b
  112. double x = 0;
  113. int counter = 0;
  114.  
  115. deriv2A = derivateIn(a, 0.001, 3, func, 2);
  116. deriv2B = derivateIn(b, 0.001, 3, func, 2);
  117.  
  118. cout<<"Drugie pochodne:"<<deriv2A<<" "<<deriv2B<<endl;
  119.  
  120. double x_const, x_i;
  121.  
  122. if( (func(a)*deriv2A) > 0.0f ){
  123. x_const = a;
  124. x_i = b;
  125. }else if( (func(b)*deriv2B) > 0.0f ){
  126. x_const = b;
  127. x_i = a;
  128. }
  129.  
  130. do{
  131. x_i = x_i - ((func(x_i)*(x_const-x_i))/(func(x_const)-func(x_i)));
  132. cout<<"iteracja["<<counter<<"]: x_i = "<<x_i<<" wartosc func:"<<func(x_i)<<endl;
  133. counter++;
  134. }while( fabs(func(x_i)) > eps);
  135.  
  136. }
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143. /* ------------ ROZNICZKOWANIE ------------*/
  144. /* ------------ CORE FUNCTIONS ------------*/
  145.  
  146. void initVectors(double *vec1, double *vec2, int size){
  147. memset(vec2, 0x00, size*sizeof(double));
  148. memset(vec1, 0x00, size*sizeof(double));
  149.  
  150. for (size_t i = 0; i < size; i++)
  151. vec1[i] = 1.0f / (i + 1);
  152.  
  153. for (size_t i = 0; i < size; i++)
  154. for (size_t j = 0; j < size; j++){
  155. if ((i+j) < size)
  156. vec2[i+j] += vec1[i] * vec1[j];
  157. }
  158.  
  159. }
  160.  
  161. void substractionVec(double x0, double h, userFuncPtr func, double *out_vec, int size){
  162. memset(out_vec, 0x00, size*sizeof(double));
  163.  
  164. double *vecOne, *vecTwo, *temp;
  165.  
  166. vecOne = new double[size+1];
  167. vecTwo = new double[size+1];
  168.  
  169. //tworzmy wektor wartosciami funkcji
  170. for (size_t i = 0; i <= size; i++)
  171. vecOne[i] = func(x0 - (i*h));
  172.  
  173.  
  174. for(size_t i = 0; i < (size); i++)
  175. {
  176. for (size_t j = 0; j < (size-i); j++)
  177. {
  178. vecTwo[j] = vecOne[j] - vecOne[j + 1];
  179. }
  180.  
  181. out_vec[i] = vecTwo[size-(i+1)];
  182.  
  183. temp = vecTwo;
  184. vecTwo = vecOne;
  185. vecOne = temp;
  186. }
  187.  
  188. delete[] vecOne;
  189. delete[] vecTwo;
  190. }
  191.  
  192.  
  193. /*Funkcja obliczajšca pochodnš funkcji
  194. parametry:
  195. x0 - punkt w który obliczana jest pochodna
  196. h - krok różniczkowania
  197. nNable - dokładnoœć różniczkowania (iloœć operatorów nabla dla n=1)
  198. func - badana funkcja
  199. n - rzšd pochodnej
  200. */
  201.  
  202. double derivateIn(double x0, double h, int nNable, userFuncPtr func, int n){
  203. //pochodne wyższego rzędu niż 2 nie sš zaimplementowane
  204. if (n > 2)
  205. return 0.0f;
  206.  
  207. double *vec1 = new double[nNable];
  208. double *vec2 = new double[nNable];
  209. double *subVec = new double[nNable];
  210. double outPut = 0;
  211.  
  212. initVectors(vec1, vec2, nNable);
  213. substractionVec(x0, h, func, subVec, nNable);
  214.  
  215.  
  216. if (n == 1){
  217. for (size_t i = 0; i < nNable; i++)
  218. {
  219. outPut += vec1[i] * subVec[i];
  220. }
  221.  
  222. outPut /= h;
  223. }
  224.  
  225. if (n == 2){
  226. for (size_t i = 0; i < (nNable-1); i++)
  227. {
  228. outPut += vec2[i] * subVec[i+1];
  229. }
  230. outPut /= pow(h,2);
  231. }
  232.  
  233.  
  234. delete [] vec1;
  235. delete [] vec2;
  236. delete [] subVec;
  237.  
  238. return outPut;
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement