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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2011, 17:41   #1
Leo705
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 16
По умолчанию Ошибка после компиляции

Написал прогу по апроксимации для экспанециальной функции работает, а для функции с логарифмом не совсем, после полученя нескольких вариантов, выдает "log: domain error" подскажите в чем трабла
Код:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>

typedef long double dateType;
int Gauss(dateType **A, dateType *B, const int n, dateType *X);
dateType func_g(dateType x, dateType *c);
void GetMatrix_func(dateType *value, dateType *c);
void GetMatrix_Jacobi(dateType **Jacobian, dateType *c);
dateType DetMatrix(dateType **M);
int sneq_Newton(dateType *x, const int n, const dateType precision);
dateType norma_diff(dateType *x1, dateType *x2, const int n);
void DrawFunc(dateType *vect_c, const int m, dateType sigma,dateType *x, dateType *y, const int n, dateType step);
dateType x[6] = { 2,2.7,3.3,4.1,4.8,5.2};
dateType y[6] = {3.190,4.820,5.909,7.087,7.943,8.378};
int n_var = 6;

void main(void) {
   clrscr();
   int i,k;int kolUr=2;
   float eps=0.001;
   dateType VectC[2];
   VectC[0] = 2.0;VectC[1] = 2.0;
   k=sneq_Newton(VectC, kolUr, eps);
   if (  k ) {
      for (i = 0; i < kolUr; ++i)
	      cout<<"!C"<<i<<" = "<<VectC[i]<<"\n";
	  cout<<"\n"<<"k="<<k<<"\n";
      getch();
   }
   else	{
	cout<<"Љ®ндд. C0 - C2 *Ґ г¤*«®бм ®ЇаҐ¤Ґ«Ёвм.\nPress any key...";
	getch();
   }
}

dateType func_g(dateType x, dateType *c) {
  dateType g = c[0] * (log(c[1] * x));
  return g;}
dateType dgc0(dateType x,dateType *c){
   return log(c[1]*x);}
dateType dgc1(dateType x,dateType *c){
   return c[0]/c[1];}
void GetMatrix_func(dateType *value, dateType *c)
{
  dateType s = 0.0;
  int i;
  for (i = 0; i < n_var; ++i)
      s += ( -y[i] + func_g(x[i], c) ) * dgc0(x[i], c);
  value[0] =  s ;
  s = 0.0;
  for (i = 0; i < n_var; ++i)
      s += ( -y[i] + func_g(x[i], c)  ) * dgc1(x[i], c);
  value[1] =   s ;}
void GetMatrix_Jacobi(dateType **J, dateType *c){
  dateType s = 0.0;
  int i;
  for (i = 0; i < n_var; ++i)
     s += dgc0(x[i],c)*dgc0(x[i],c);
  J[0][0] = s;
  s = 0.0;
  for (i = 0; i < n_var; ++i)
      s += (   dgc0(x[i],c)*dgc1(x[i],c)+( -y[i]+func_g(x[i], c)) *(1/c[1]));
  J[0][1] =  s ;
  s = 0.0;
  for (i = 0; i < n_var; ++i)
     s +=(  dgc0(x[i],c)*dgc1(x[i],c)+( -y[i]+func_g(x[i], c)) *(1/c[1]));
  J[1][0] =  s ;
  s = 0.0;
  for (i = 0; i < n_var; ++i)
     s += (dgc1(x[i],c)*dgc1(x[i],c)+( -y[i]+func_g(x[i], c))*(- c[0] /(c[1]*c[1] )));
  J[1][1] =  s ;
}

int sneq_Newton( dateType *x, const int n, const dateType precision)
{
  dateType *x_prev = new dateType[n];
  dateType *x_next = new dateType[n];
  dateType *delta_x = new dateType[n];
  dateType **ma = new dateType*[n];
  int i, j, kIter=0;
  for (i = 0; i < n; ++i) ma[i] = new dateType[n];
  dateType *mb = new dateType[n];
  for (i = 0; i < n; ++i) x_next[i] = x[i];
  do  {
    for (i = 0; i < n; ++i) x_prev[i] = x_next[i];
    GetMatrix_Jacobi(ma, x_prev);
for (i = 0; i < n; i++){
for (j = 0; j < n; j++)
	      cout<<"!!!"<<" = "<<ma[i][j]<<"\t";cout<<"\n";}
    if ( DetMatrix(ma) == 0.0 ) return 0;
    GetMatrix_func(mb, x_prev);
    Gauss (ma, mb, n, delta_x);
    for (i = 0; i < n; ++i) 
         x_next[i] = x_prev[i] + delta_x[i];
    kIter++;
    for (i = 0; i < n; ++i)
        cout<<"==C"<<i<<" = "<<x_prev[i]<<"\n";
  } while (norma_diff(x_prev, x_next, n) >= precision);
  for (i = 0; i < n; ++i) x[i] = x_next[i];
  delete[] mb;
  for (i = 0; n < i; ++i) delete[] ma[i];
  delete[] ma;
  delete[] delta_x;
  delete[] x_prev;
  delete[] x_next;
  return kIter;}
dateType DetMatrix(dateType **M)
{
  return (M[0][0]*M[1][1]- M[0][1]*M[1][0]);}

dateType norma_diff(dateType *x1, dateType *x2, const int n)
{
  dateType norme = fabs(x2[0] - x1[0]);
  dateType tmp;
  for (int i = 1; i < n; ++i) {
      tmp = fabs(x2[i] - x1[i]);
      if ( norme < tmp )  norme = tmp;}
  return norme;}

int Gauss (dateType **A, dateType *B, const int n, dateType *X)
{
	int i, j, k;
	int iCount = 0;
	dateType **ma = new dateType*[n];
	for (i = 0; i < n; ++i)
			ma[i] = new dateType[n];
	dateType *mb = new dateType[n];
	for (i = 0; i < n; ++i) {
             mb[i] = -B[i];
	     for (j = 0; j < n; ++j)
		 ma[i][j] = A[i][j];}
	for (i = 0; i < n; ++i) {
	    dateType divisor = ma[i][i];
	    for (j = 0; j < n; ++j){
		ma[i][j] /= divisor;
		++iCount;}
	    mb[i] /= divisor;
	    for (k = i+1; k < n; ++k) {
		 dateType mult = ma[k][i];
		 for (j = i; j < n; ++j) {
		     ma[k][j] -= ma[i][j] * mult;
		     ++iCount;}
		 mb[k] -= mb[i] * mult;
		 ++iCount;}
	   ++iCount;}
	for (i = n-1; i >= 0; --i) {
	    dateType subtr = 0;
	    for (j = i+1; j < n; ++j) {
		 subtr += X[j] * ma[i][j];
		 ++iCount;}
	    X[i] = mb[i] - subtr;
	    ++iCount;}
	delete[] mb;
	for (i = 0; i < n; ++i)
	    delete[] ma[i];
	delete[] ma;
	return iCount;}

Последний раз редактировалось Leo705; 29.01.2011 в 12:28.
Leo705 вне форума Ответить с цитированием
Старый 28.01.2011, 18:28   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

покаж код -.-
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 29.01.2011, 00:14   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,378
По умолчанию

Код нужно размещать тут, а не заставлять форумчан качать подозрительные файлы неизвестного содержания
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 29.01.2011, 12:08   #4
Leo705
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 16
По умолчанию

Извините виноват, кстати ошибка вылетает из за того что на 4 или 5 шагу итерации коэфициент вычисляется с минусом, а log(-"число") выдает ошибку, не пойму где проблемма. Вычислил матрицу якоби решаю методом гаусса, решения есть но с минусом. В автокаде все решается без проблемм.

Последний раз редактировалось Leo705; 29.01.2011 в 12:33.
Leo705 вне форума Ответить с цитированием
Старый 29.01.2011, 13:02   #5
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

трассировку делали? что показывает? и причем тут автокад? если понимаете алгоритм, поставьте брекпоинты и делайте трассировку.
pacniwassano вне форума Ответить с цитированием
Старый 29.01.2011, 13:08   #6
Leo705
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 16
По умолчанию

с автокадом я просто результаты сравнивал. Трассировку делал, там то и выяснил что на 5 шаге в функцию Log передается отрицательное значение и поэтому ошибка, перепроверял всю ночь матрицу Якоби и метод Гаусса, все нормально, может мне выбрать другой метод решения нелинейных систем, я просто думал что метод Ньютона подойдет ко всем
Leo705 вне форума Ответить с цитированием
Старый 29.01.2011, 18:53   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
void main(void)
int main()

Цитата:
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <сstdlib>
#include <iostream>
#include <windows.h>
#include <cstdio>
#include <cmath>

Цитата:
for (i = 0; i < n_var; ++i)
for (int i = 0; i < n_var; ++i), счётчики снаружи незачем объявлять. Область видимости переменных должна быть минимально необходимой.

А log от отрицательного числа естественно приведёт к ошибке.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 29.01.2011 в 18:55.
Obey-Kun вне форума Ответить с цитированием
Старый 29.01.2011, 19:08   #8
Leo705
Пользователь
 
Регистрация: 13.04.2010
Сообщений: 16
По умолчанию

не совсем понял замечание по циклу. а то что лог от отрицательного ошибка эт понятно, может кто скажет как можно решить задачу каким то другим способом. (сама задача: аппроксимировать функцию методом наименьших квадратов c0*ln(c1*x)),функция задана таблично.
Leo705 вне форума Ответить с цитированием
Старый 29.01.2011, 19:12   #9
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

obey-kun ты б лучше помог, чем указывать на то, что работает, пусть и не по стандарту
pacniwassano вне форума Ответить с цитированием
Старый 29.01.2011, 19:21   #10
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Я так понял, у товарища алгоритм приводит к тому, что происходит попытка посчитать логарифм отрицательного числа. Чем я тут могу помочь? Пусть ищет ошибку в алгоритме сам, язык-то тут ни при чём. Ну вот методом Гаусса решают : http://www.opita.net/node/61
Почистить от лишнего кода (с графикой связанного) и готово.

Цитата:
не совсем понял замечание по циклу.
Золотое правило — область видимости переменных должна быть минимально необходимой.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 29.01.2011 в 19:25.
Obey-Kun вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компиляции Lokos Общие вопросы Delphi 3 07.10.2010 08:17
Работа exe-файлов после компиляции Maks1978 Общие вопросы C/C++ 3 12.08.2010 22:03
Ошибка в алгоритме?Выдает ошибку после компиляции. Aerial Общие вопросы C/C++ 2 12.05.2010 16:52
Ошибки после компиляции Cakeinpanic Общие вопросы C/C++ 8 16.05.2009 14:48
delphi7 программа после компиляции сразу закрывается fredd Помощь студентам 1 30.10.2008 14:25