Решение системы нелинейных уравнений. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно решить систему уравнений, методом ньютона. Решаю задачу на СИ, все по блок схеме. Пересел с паскаля буквально месяц. Возможно где то накосячил, помогите с ошибкой. При запуске программы пишет Floating Point error: Domain. Прикрепил блок схему и саму задачу. Неделю парюсь(
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. double fun1(double x1,double x2)
  5. {
  6. double f;
  7. f=x1+3*(log(x1)/log(10))-x2*x2;
  8. return f;
  9. }
  10. double fun2(double x1,double x2)
  11. {
  12. double f;
  13. f=2*x1*2*x1-x1*x2-5*x1+1;
  14. return f;
  15. }
  16. double fun1x1(double x1)
  17. {
  18. double f;
  19. f=1+3/x1;
  20. return f;
  21. }
  22. double fun1x2(double x2)
  23. {
  24. double f;
  25. f=2*x2;
  26. return f;
  27. }
  28. double fun2x1(double x1, double x2)
  29. {
  30. double f;
  31. f=4*x1-x2-5;
  32. return f;
  33. }
  34. double fun2x2(double x1)
  35. {
  36. double f;
  37. f=-x1;
  38. return f;
  39. }
  40. void main()
  41. {
  42. double x1,x2,e,x10,x20,a[3][3],b[3],dx1,dx2;
  43. clrscr();
  44. // printf ("vvedite x1 ");
  45. //scanf ("%f", &x1);
  46. //printf ("vvedite x2 ");
  47. //scanf ("%f", &x2);
  48. x1=3.4;
  49. x2=2.2;
  50. e=0.00001;
  51. do
  52. {
  53. x10=x1;
  54. x20=x2;
  55. b[1]=-fun1(x10,x20);
  56. b[2]=-fun2(x10,x20);
  57. a[1][1]=fun1x1(x10); a[1][2]=fun1x2(x20);
  58. a[2][1]=fun2x1(x10,x20); a[2][2]=fun2x2(x10);
  59. dx1=(b[1]*a[2][2]-a[1][2]*b[2])/(a[1][1]*a[2][2]-a[1][2]*a[2][1]);
  60. dx2=(a[1][1]*b[2]-b[1]*a[2][1])/(a[1][1]*a[2][2]-a[1][2]*a[2][1]);
  61. x1=x10+dx1;
  62. x2=x20+dx2;
  63. } while ((fabs(dx1)>=e) || (fabs(dx2)>=e));
  64. printf ("x1 = %f\n",x1);
  65. printf ("x2 = %f\n",x2);
  66. getch();
  67. }

Решение задачи: «Решение системы нелинейных уравнений.»

textual
Листинг программы
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <math.h>
  4.  
  5.  
  6. #if 0  // код в этом блоке компилятор не воспринимает, так как препроцессор его сьедает, можно здесь писать всякую чепуху не по делу и ничего не бояться
  7. xy-tg(x-y)=0
  8. 0,5x^2+2y^2-1=0
  9.  
  10. x=0,975247
  11. y=0,512078    
  12. #endif
  13.  
  14. double fun1(double x,double y)
  15. {
  16.     double f;
  17.     f=x*y-tan(x-y); //здесь твоя функция №1
  18.     return f;
  19. }
  20.  
  21. double fun2(double x,double y)
  22. {
  23.     double f;
  24.     f=0.5*x*x+2*y*y-1; //здесь твоя функция №2
  25.     return f;
  26. }
  27.  
  28. double dfun1_dx(double x,double y)
  29. {
  30.     double f;
  31.     f=(y-1)*x-(tan(x-y)*tan(x-y)+1); //здесь твоя производная от функции №1 по х
  32.     return f;
  33. }
  34.  
  35. double dfun1_dy(double x,double y)
  36. {
  37.     double f;
  38.     f=(x-1)*y+(tan(x-y)*tan(x-y)+1);  //здесь твоя производная от функции №1 по y
  39.     return f;
  40. }
  41.  
  42. double dfun2_dx(double x, double y)
  43. {
  44.     double f;
  45.     f=x;   //здесь твоя производная от функции №2 по х
  46.     return f;
  47. }
  48.  
  49. double dfun2_dy(double x,double y)
  50. {
  51.     double f;
  52.     f=4*y;   //здесь твоя производная от функции №2 по y
  53.     return f;
  54. }
  55.  
  56. using namespace std;
  57.  
  58. int main()
  59. {
  60.     double x,y,e,x0,y0,a,b,c,d,lick,suck,dx,dy; // переменные, все те же что и у тебя только без массивов ( массивов в с++ нету как таковых, но можно сделать но это надо отдельно обьяснять)
  61.    
  62.     x=0.9; // (приближенное х)
  63.     y=0.5; // (приближенное у)
  64.     e=0.000001; //точность
  65.  
  66.     do
  67.     {
  68.         x0=x;
  69.         y0=y;
  70.         lick=-fun1(x0,y0);
  71.         suck=-fun2(x0,y0);
  72.         a=dfun1_dx(x0,y0);
  73.         b=dfun1_dy(x0,y0);
  74.         c=dfun2_dx(x0,y0);
  75.         d=dfun2_dy(x0,y0);
  76.         dx=(lick*d-b*suck)/(a*d-b*c);
  77.         dy=(a*suck-lick*c)/(a*d-b*c);
  78.         x=x0+dx;
  79.         y=y0+dy;
  80.     } while (((dx<e && dx>(-e)) || (dy<e && dy>(-e)))==false);  // в этом цикле все абсолютно в точности как у тебя, ничего менять не нужно (кстати в твоем коде ошибки, здесь исправлены)
  81.  
  82.     printf ("x = %f\n",x);
  83.     printf ("y = %f\n",y);
  84.     system("PAUSE");
  85.     return 1;
  86. }

Объяснение кода листинга программы

Код решает систему нелинейных уравнений методом итераций. Вот список действий, которые код выполняет по порядку:

  1. Объявляет функции fun1 и fun2, которые представляют собой левую и правую части уравнений системы.
  2. Объявляет функции dfun1_dx и dfun1_dy, которые представляют собой производные левой части уравнений системы по переменным x и y.
  3. Объявляет функции dfun2_dx и dfun2_dy, которые представляют собой производные правой части уравнений системы по переменным x и y.
  4. В функции main задаёт начальные приближения для переменных x и y (в данном случае 0.9 и 0.5 соответственно).
  5. Задаёт точность e, которая определяет, когда следует остановить итерационный процесс.
  6. Запускает итерационный процесс с помощью цикла do-while, в котором на каждой итерации обновляет значения переменных x и y с помощью формулы итерационного процесса.
  7. Проверяет условие остановки: если изменение x и y на текущей итерации меньше e, то процесс продолжается.
  8. После выхода из цикла выводит значения x и y на экран.
  9. Вызывает функцию system(PAUSE), чтобы программа не закрылась сразу после вывода, а дождалась нажатия клавиши.
  10. Возвращает 1, чтобы программа не закрылась сразу после вызова функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы