2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Система нелинейных уравнений. Метод Ньютона (c++)
Сообщение30.11.2019, 19:54 


30/11/19
53
Доброго времени суток!
СНАУ Методом Ньютона:
$$\left\{
\begin{array}{rcl}
 2sin(x+y)-1.2x=0.1& \\
 x^2+y^2=1 \\
\end{array}
\right.$$

В выводе получается ерунда. Подбирал разные значения - не выходит..
Изображение

В чем ошибка?

Сам код:
Код:
#include <iostream>
#include <math.h>
#include <stdlib.h>
//#include<windows.h>
using namespace std;

double function1(double x, double y)//функция 1
{
    return 2*sin(x + y) - 1.2*x - 0.1 ; //первое уравнение системы
}

double function2(double x, double y) //функция 2
{
    return x*x + y*y - 1;// второе уравнение системы
}

double func11(double x, double y) // первая призводная функции 1
{
    return cos(x + y) - 1.2;
}

double func12(double x, double y) // вторая производная функции 1
{
    return cos(x + y);
}

double func21(double x, double y) // первая призводная функции 2 по х
{
    return 2*x;
}

double func22(double x, double y) // первая призводная функции 2 по у
{
    return 2*y;
}

void ober_matr(double a[2][2]) // матрица 2 на 2 //вычисление якобиана
{
    double det, aa;
    det = a[1][1]*a[2][2] - a[1][2]*a[2][1]; // считаем опредлитель
    a[1][1] = a[2][2]/det;
    a[2][2] = a[1][1]/det;
    a[1][2] = -a[1][2]/det;
    a[2][1] = -a[2][1]/det;
}

void nuton(double x, double y, double eps) // метод Ньютона
{
    int i = 1;
    double a[2][2], dx, dy, b[2], n;
    do
    {
        a[1][1] = func11(x, y);
        a[1][2] = func12(x, y);
        a[2][1] = func21(x, y);
        a[2][2] = func22(x, y);
        ober_matr(a);
        dx = -a[1][1]*function1(x, y) + -a[1][2]*function2(x, y);
        dy = -a[2][1]*function1(x, y) + -a[2][2]*function2(x, y);
        x = x + dx;
        y = y + dy;
        b[1] = function1(x, y);
        b[2] = function2(x, y);
        n = sqrt(b[1]*b[1]+b[2]*b[2]);
        i++;
    }
    while (n >= eps);
    cout <<"Otvet "<< endl; 
    cout << x << endl << y << endl << endl;
    cout <<"Proverka"<< endl;
    cout <<abs(function1(x, y))<< endl;//вывод на экран абсолютного значения функции
    cout <<abs(function1(x, y))<< endl;
}
int main()
{
    double a, b, eps; // a b  приближенные значения неизвестных х и у
    cout << " a = ";
    cin >> a ;
    cout << " b = ";
    cin >> b;
    cout << " eps = "; // вводим точность
    cin >> eps;
    nuton(a, b, eps); // вызов метода ньютон
    cout << endl;
    system("PAUSE");
}

 Профиль  
                  
 
 Re: Система нелинейных уравнений. Метод Ньютона (c++)
Сообщение30.11.2019, 20:02 
Заслуженный участник


09/05/12
25179
Dr Blue в сообщении #1428313 писал(а):
void ober_matr(double a[2][2]) // матрица 2 на 2 //вычисление якобиана
{
double det, aa;
det = a[1][1]*a[2][2] - a[1][2]*a[2][1]; // считаем опредлитель
Еще бы тут ерунда не получалась...

Если определить массив double x[2], то у него будет два элемента - x[0] и x[1]. Попытка обратиться к x[2] приведет к чтению памяти за массивом, в которой будет лежать неизвестно что (и, возможно, к падению программы с ошибкой времени выполнения, если окажется, что эта память принадлежит другому процессу).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group