Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 08:57   #1
Drozd Oleg
 
Регистрация: 21.02.2010
Сообщений: 4
По умолчанию Некорректный вывод результата (1,#J)

Всем добрый день.
Пытаюсь реализовать в консольном приложении метод Ньютона-Рафсона, программа до конца еще не дописана, но что есть, то есть.
Есть вот такая проблема, при расчете обратной матрицы некорректно выводится результат (скриншот ниже).
Код:
Код:
// Ньютон-Рафсон.cpp: определяет точку входа для консольного приложения.
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <locale.h>
#include "stdafx.h"

using namespace std;

#define e 2.718281828

using namespace std;

	double f(double x1,double x2) //Исходная функция
	{return 20.0*x1+0.4*x2+exp(0.3*x1*x1+0.3*x2*x2);}

	double f1(double x1,double x2) //Первая производная по х1
	{return 20.0+0.6*x1*exp(0.3*x1*x1+0.3*x2*x2);}

	double f2(double x1,double x2) //Первая производная по x2
	{return 0.4+0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

	double f11(double x1,double x2) // Вторая по x1х1
	{return 0.6*exp(0.3*x1*x1+0.3*x2*x2)+exp(0.3*x1*x1+0.3*x2*x2)*x1*x1*0.6*0.6;}

	double f12(double x1,double x2) // Вторая по х1х2
	{return 0.6*x1*0.6*x2*exp(0.3*x1*x1+0.3*x2*x2);}

	double f22(double x1,double x2) //Вторая по х2х2
	{return exp(0.3*x1*x1+0.3*x2*x2)*0.6+exp(0.3*x1*x1+0.3*x2*x2)*0.6*0.6*x2*x2;}

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL, "Russian");
	double Eps1, Eps2, X_0, Y_0;
	double grad1, grad2;
	double gesse [2][2];
	double obr_gesse[2][2];
	double det_gesse;
	int M, k = 0;

	printf( "\n" );
	printf ("Введите Eps 1:\n");
	cin >> Eps1;
	printf ("Введите Eps 2:\n");			
	cin >> Eps2;
	printf ("Введите M:\n");			
	cin >> M;	
	printf("Ввод координат начальной точки:\n");
	printf ("X0:\n");			
	cin >> X_0;
	printf ("Y0:\n");			
	cin >> Y_0;
	
	// Получение градиента Шаг 1
	grad1 = f1(X_0,Y_0);
	grad2 = f2(X_0,Y_0);
	printf("Градиент:\n");
	printf(" %5.2f, %5.2f", grad1, grad2);
	printf("\n");
	
	// Получение метрицы Гессе шаг 1
	gesse[0][0]= f11(X_0,Y_0);
	gesse[0][1] = gesse[1][0] = f12(X_0,Y_0);
	gesse[1][1]= f22(X_0,Y_0);
	
	// Получение метрицы Гессе шаг 1	
	int i, j;
	printf("Полученная матрица Гессе: \n");
	for(i = 0; i < 2; i++)
    {
        printf("\n");
		for(j = 0; j < 2; j++)
		printf(" %5.2f", gesse[i][j]);
    }
	printf("\n");
	//Проверка условия 1
	if (sqrt (grad1*grad1+grad2*grad2)<= Eps1)
	{
		printf("Расчет окончен\n");
	}
	else
	{
		printf("Продолжаем расчет\n");
		goto point1;
	}
	point1:
	// Проверка условия 2
	if (k >= M)
	{
		printf("Расчет окончен\n");
	}
	else
	{
		printf("Продолжаем расчет\n");
		goto point2;
	}
	point2:
	// Вычисление матрицы Гессе от xk, Шаг 6
	gesse[0][0]= f11(X_0,Y_0);
	gesse[0][1] = gesse[1][0] = f12(X_0,Y_0);
	gesse[1][1]= f22(X_0,Y_0);
	
	// Получение метрицы Гессе шаг 1	
	printf("Полученная матрица Гессе: \n");
	for(i = 0; i < 2; i++)
    {
        printf("\n");
		for(j = 0; j < 2; j++)
		printf(" %5.2f", gesse[i][j]);
    }
	printf("\n");
	//Шаг 7, поиск обратной матрицы к матрице Гессе
	det_gesse = gesse[0][0]*gesse[1][1] - gesse[0][1]*gesse[1][0];
	printf("det gesse: %5.2f", det_gesse);
	if (det_gesse = 0)
		printf("Выберите другую матрицу\n");
	else
	{
		obr_gesse[0][0] = gesse[1][1] / det_gesse;
		obr_gesse[0][1] = gesse[0][1]*(-1) / det_gesse;
		obr_gesse[1][0] = gesse[1][0]*(-1) / det_gesse;
		obr_gesse[1][1] = gesse[0][0] / det_gesse;
		int i, j;
	printf("Полученная обратная матрица Гессе: \n");
	for(i = 0; i < 2; i++)
    {
        printf("\n");
		for(j = 0; j < 2; j++)
		printf(" %5.2f", obr_gesse[i][j]);
    }
	printf("\n");
	// Проверка условия Шаг 8
	if ((obr_gesse[0][0] > 0) && (obr_gesse[0][0]*obr_gesse[1][1] - obr_gesse[0][1]*obr_gesse[1][0] > 0))
	{
	printf ("по критерию Сльвестра идем дальше/n");
	}
	else
	system ("pause");
	}
}
И еще кто-нибудь может подсказать хорошую реализацию метода в консоли на C++ с подробным выводом промежуточных точек?
Drozd Oleg вне форума Ответить с цитированием
Старый 25.09.2011, 10:38   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
if (det_gesse = 0)
		printf("Выберите другую матрицу\n");
	else
WTF?
f.hump вне форума Ответить с цитированием
Старый 25.09.2011, 11:52   #3
Drozd Oleg
 
Регистрация: 21.02.2010
Сообщений: 4
По умолчанию

Эта программа еще не дописана, проблему-бы решить сначала. Так что пусть это вас не смущает
Drozd Oleg вне форума Ответить с цитированием
Старый 25.09.2011, 12:31   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

это и есть проблема.
всместо того, чтобы выполнить проверку ==, делаешь присвоение =, ну а потом деление на 0 и интересный результат.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод результата в Memo Giggs13 Общие вопросы Delphi 1 20.02.2011 12:56
Вывод результата Delphi Nikita++ Помощь студентам 5 20.12.2010 15:48
вывод результата на порт В ТатьянаП Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 26.10.2010 07:28
Некорректный вывод изображения Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 24.07.2010 00:12
Ассемблер вывод результата. SickUSP Помощь студентам 0 28.01.2010 18:13