2014 dxdy logo

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

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




 
 Система нелинейных уравнений. Метод Ньютона (c++)
Сообщение30.11.2019, 19:54 
Доброго времени суток!
СНАУ Методом Ньютона:
$$\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 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group