|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.05.2016, 11:48 | #1 |
Новичок
Джуниор
Регистрация: 05.05.2016
Сообщений: 1
|
Решение системы нелинейных уравнений С++
Здравствуйте! Очень нужна помощь. Получила задание написать программу на С++ для решения системы нелинейных уравнений: 0.1-pow(x,2)+2*y*z-x; -0.2+pow(y,2)-3*x*z-y; 0.3-pow(z,2)-2*x*y-z, методом Ньютона.
Что-то получилось, но все никак не удается разобраться до конца Подскажите, пожалуйста, что не так и как нужно #include <vcl.h> #include <iostream.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int n=2; int i,j; double x,y,z,esp; double f1(double x, double y, double z); double f1(double x, double y, double z){ return 0.1-pow(x,2)+2*y*z-x; } double f2(double x, double y, double z); double f2(double x, double y, double z){ return -0.2+pow(y,2)-3*x*z-y; } double f3(double x, double y, double z); double f3(double x, double y, double z){ return 0.3-pow(z,2)-2*x*y-z;} //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { x=StrToFloat(Edit1->Text); y=StrToFloat(Edit2->Text); z=StrToFloat(Edit3->Text); esp=StrToFloat(Edit4->Text); double a[2][2], a1[2][2], b[2], det, invdet, f[2], K[2]; //a[2][2]-матрица Якоби; //a1[2][2]-обратная матрица; b[2]-произведение а1[2] на f[2]; f[2]-массив ф-ций; K[2]-массив переменных double xk, yk, zk; //изменение значения переменных при k=0,1,2.. int k; //кол-во итераций { k=0; //Строится матрица Якоби { for (i=0; i<n; i++) for (j=0; j<n; j++){ a[0][0]=(-2*x-1); a[0][1]=(2*z); a[0][2]=(2*y); a[1][0]=(-3*z); a[1][1]=(2*y-1); a[1][2]=(-3*x); a[2][0]=(-2*y); a[2][1]=(-2*x); a[2][2]=(-2*z-1); } //Находится ее определитель det=a[0][0]*a[1][1]*a[2][2]+a[0][1]*a[1][2]*a[2][0]+a[0][2]*a[1][0]*a[2][1]- a[0][2]*a[1][1]*a[2][0]-a[0][0]*a[1][2]*a[2][1]-a[0][1]*a[1][0]*a[2][2]; invdet=1/det; //Обратная матрица for (i=0; i<n; i++) for (j=0; j<n; j++){ a1[0][0]=a[1][1]*a[2][2]-a[1][2]*a[2][1]*invdet; a1[0][1]=-a[0][1]*a[2][2]+a[0][2]*a[2][1]*invdet; a1[0][2]=a[0][1]*a[1][2]-a[0][2]*a[1][1]*invdet; a1[1][0]=-a[1][0]*a[2][2]+a[1][2]*a[2][0]*invdet; a1[1][1]=a[0][0]*a[2][2]-a[0][2]*a[2][0]*invdet; a1[1][2]=-a[0][0]*a[1][2]+a[0][2]*a[1][0]*invdet; a1[2][0]=a[1][0]*a[2][1]-a[1][1]*a[2][0]*invdet; a1[2][1]=-a[0][0]*a[2][1]+a[0][1]*a[2][0]*invdet; a1[2][2]=a[0][0]*a[1][1]-a[0][1]*a[1][0]*invdet; } //Массив ф-ций for (j=0; j<n; j++){ f[0]=f1(x,y,z); f[1]=f2(x,y,z); f[2]=f3(x,y,z); } //массив переменных for (j=0; j<n; j++){ K[0]=x; K[1]=y; K[2]=z; } do { for (i=0; i<n; i++) for (j=0; j<n; j++){ b[0]=a[0][0]*f[0]+a[0][1]*f[1]+a[0][2]*f[2]; b[1]=a[1][0]*f[0]+a[1][1]*f[1]+a[1][2]*f[2]; b[2]=a[2][0]*f[0]+a[2][1]*f[1]+a[2][2]*f[2]; } xk=K[0]-b[0]; yk=K[1]-b[1]; zk=K[2]-b[2]; } while ((abs(xk-x)>esp)&&(abs(yk-y)>esp)&&(abs(zk-z)>esp)); x==xk; y==yk; z==zk; k++; } } Edit5->Text=xk; Edit6->Text=yk; Edit7->Text=zk; Edit8->Text=k; } |
21.05.2016, 18:27 | #2 |
Участник клуба
Регистрация: 14.05.2016
Сообщений: 1,793
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
С#. Решение системы нелинейных уравнений методом Ньютона | Елена Атмалкина | Помощь студентам | 2 | 17.12.2015 18:52 |
Решение системы нелинейных алгебраических уравнений методом Ньютона (2 уравнения) | Неопытный | Общие вопросы C/C++ | 0 | 29.05.2012 19:13 |
Delphi. Решение системы нелинейных уравнений методами Ньютона и простых итераций. Помогите найти ошибку! | Sianessa | Помощь студентам | 8 | 13.04.2012 17:32 |
Решение системы нелинейных уравнений методом Ньютона на Pascal | spaike619 | Помощь студентам | 0 | 28.02.2012 00:33 |
Решение системы нелинейных уравнений методом итераций на Pascal | Кушников | Помощь студентам | 0 | 25.02.2011 12:41 |