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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 18:48   #31
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Думала, что все ок. А, оказалось не очень все так отлично, как предполагалось.
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 18:54   #32
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Вот на эту функцию идет ссылка. И в ней выводится вектор F с результатами.

Код:
void interface::equilibre_Fe_Cr_C(int n, std::vector <double> Y, std::vector <double> F)
{
Y[0] = ph1->Thermo->y1[0];
Y[1] = ph1->Thermo->y1[1];
Y[2] = ph1->Thermo->y2[0];
Y[3] = ph1->Thermo->y2[1];
Y[4] = ph2->Thermo->y1[0];
Y[5] = ph2->Thermo->y1[1];
Y[6] = ph2->Thermo->y2[0];
Y[7] = ph2->Thermo->y2[1];
Y[8] = X_nf; 
 F[0] = ph1->Thermo->pot_chemical1[0] - ph2->Thermo->pot_chemical1[0];
 F[1] = ph1->Thermo->pot_chemical1[1] - ph2->Thermo->pot_chemical1[1];
 F[2] = ph1->Thermo->pot_chemical2[0] - ph2->Thermo->pot_chemical2[0];
 F[3] = Y[0] + Y[1] - 1; 
 F[4] = Y[4] + Y[5] - 1; 
 F[5] = Y[2] + Y[3] - 1; 
 F[6] = Y[6] + Y[7] - 1; 
 F[7] = (ph1->Thermo->m[0] * Y[1])/(ph1->Thermo->m[0] + ph1->Thermo->m[1]) * Y[8] + (ph2->Thermo->m[0] * Y[5])/(ph2->Thermo->m[0] + ph2->Thermo->m[1]) * (1 - Y[8]) - X_Cr; 
 F[8] = (ph1->Thermo->m[1] * Y[2])/(ph1->Thermo->m[0] + ph1->Thermo->m[1]) * Y[8]  + (ph2->Thermo->m[1] * Y[6])/(ph2->Thermo->m[0] + ph2->Thermo->m[1]) * (1 - Y[8]) - X_C; 

for (int i = 0; i < F.size(); i++){
 printf("%lf\n",F[i]);} 
}
Код:
double newt::fmin(std::vector <double> x)
{
 int i;
 double sum;
 if (func == NULL)
 {
   printf("Chert, func is NULL!!!\n");
   return 0;
 }
 if (nrfuncv == NULL)
 {
   printf("Chert, nrfuncv is NULL!!!\n");
   return 0;
 }
 (func->*nrfuncv)(GetN(), x, fvec);

А вот здесь этот же вектор с результатами должен  быть. Распечатывает вектор с нулями. Тоесть что-то ни так опять.

   for(int i=0 ; i < fvec.size() ; i++)
    {printf("%lf",fvec[i]);}

 for (sum = 0.0, i = 0; i < nn; ++i)
   sum += fvec[i]*fvec[i];
 return 0.5*sum;
}
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 19:06   #33
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Вы вектора передаёте по значению, а не по ссылке или указателю. Потому внутри функций Вы работаете с "клоном" передаваемого вектора. Пробуйте так:
Код:
void interface::equilibre_Fe_Cr_C(int n, std::vector <double> &Y, std::vector <double> &F)
{
...
}

double newt::fmin(std::vector <double> &x)
{
...
}
pu4koff вне форума Ответить с цитированием
Старый 23.04.2009, 19:12   #34
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Код:
void newt::calc(std::vector <double> x, int *check)

{
  FILE *fp = fopen("sortie.txt","w");
  std::vector <double> g(nn), xold(nn);
  fvec.resize(nn);
  double fold, F = fmin(x) //Значит здесь F всегда будет равен нулю.;

  double sum = 0;

  for (int i = 0; i < nn; ++i)

  sum += SQRnewt(x[i]);

  double stpmax = STPMXnewt*FMAXnewt(sqrt(sum), (double)nn);
  std::vector <double> f(nn);
  try

  {

    while (true)

    {  
      (func->*nrfuncv)(nn, x, f);

      std::vector < std::vector<double> > J(nn);
      for(int i = 0 ; i < J.size() ; i++)
      {
       J[i].resize(nn);
      } 
      (jacobian->*jacobfunc)(x,f,J);
И здесь матрица будет заполняться нулями, потому что она клон. Елки-палки.
Как же тогда его не клоном сделать?
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 19:14   #35
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Да, ну и что это меняет?
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 19:27   #36
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Просто если это клон.. И не берет на прямую значения.
В моей функций ЛУП разложения имеется матрица Жакобиана, которая расчитивается из функции

Код:
void interface::equilibre_Fe_Cr_C(int n, std::vector <double> Y, std::vector <double> F)
Код:
void interface::Jacobian(std::vector <double> Y,  std::vector <double> F, std::vector < std::vector<double> > Jacobian2D)
{
int i,j,n;
 int i1 = Y.size();
 std::vector <double> Y1(i1);
 std::vector <double> F1(i1);

//for (i = 0; i < i1; i++){
// printf("%lf\n",F[i]);} 

for (i = 0; i < i1; i++){
 Y1[i] = Y[i] + kdelta;}

 equilibre_Fe_Cr_C(n,Y1,F1); 

//for (i = 0; i < i1; i++){
// printf("%lf\n",F1[i]);} 
И в результате видает, что матрица вырожденна. Потому что матрица Жакобиана клон и заполняется нулями

for( i=0 ; i < Jacobian2D.size() ; i++)
 for(j=0 ; j < Jacobian2D[i].size() ; j++) 
  {
   Jacobian2D[i][j] = (F1[i] - F[i])/kdelta; 
  }
}
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 19:31   #37
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Ну и передавайте по ссылке. В чём проблема?
pu4koff вне форума Ответить с цитированием
Старый 23.04.2009, 19:33   #38
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Ваше предложение не работает.
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 19:39   #39
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Я вообще тундра в этих ссылках и адресах .Щас попробую передать. Только предварительно в книжке покапаюсь
ciaonataha вне форума Ответить с цитированием
Старый 23.04.2009, 23:31   #40
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Имею странную ошибку. Сталкивался с ней кто-нить
Код:
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4              5763648   5438716     32148 88% /
tmpfs                   971284         0    971284   0% /lib/init/rw
varrun                  971284       112    971172   1% /var/run
varlock                 971284         0    971284   0% /var/lock
udev                    971284      2848    968436   1% /dev
tmpfs                   971284       440    970844   1% /dev/shm
overflow                  1024       264       760  26% /tmp
/dev/sdc1            117218240  44935244  72282996  39% /media/natasho_pere
ciaonataha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что делает команда Run.Detach From Program? JY_ Общие вопросы Delphi 3 20.01.2009 13:58
program Project1; необходимо перенести из Pascal в Delphi Toxass Общие вопросы Delphi 22 24.11.2008 08:53
Install (Update program) MAcK Общие вопросы .NET 0 23.10.2008 11:00
Узнать Received XAOC-forever Работа с сетью в Delphi 0 30.09.2008 14:49
Copy Program с изменением атрибутов Трофимов Андрей Паскаль, Turbo Pascal, PascalABC.NET 3 04.07.2007 20:10