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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2009, 19:18   #1
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию цикл по for () и while()

Этот цикл должен уменьшать значения вектор x, если хотя бы одно из его значений , за исключением последнего, больше 1 + и увеличивать, если меньше нуля...Но этот цикл не работает в итоге.

Код:
for (i = 0; i < n-1; i++)
                 {
                   if (x[i] <= 0)
                     { 
                        printf("x<=0!\n");
                        while(x[i]>0)
                         {
                           int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k + 1;
                         }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                   if (x[i] >= 1)
                     {
                        printf ("x>=1\n");
                        while (x[i]<1)
                         {
                           int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k+1;
                         }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                 }
ciaonataha вне форума Ответить с цитированием
Старый 24.06.2009, 19:22   #2
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

А как вообще возможно выполнение подобных фрагментов программы?
if (x[i] <= 0)
{
printf("x<=0!\n");
while(x[i]>0)
Ниже то же самое. Вы проверили, что x[i] <= 0 и следом идет цикл while, в котором условие x[i] > 0... Это как простите?
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 24.06.2009, 19:51   #3
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

да, ошиблась...ну здорово..
только и этот вариант не работает
Код:
 for (i = 0; i < n-1; i++)
                 {
                   if (x[i] <= 0)
                     { 
                        printf("x<=0!\n");
                        while(x[i]<0)
                         {
                           int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k + 1;
                         }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                   else if (x[i] >= 1)
                     {
                        printf ("x>=1\n");
                        while (x[i]>1)
                         {
                           int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k+1;
                         }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                 }
ciaonataha вне форума Ответить с цитированием
Старый 24.06.2009, 20:14   #4
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

в первом цикле for int i поставьте и там точно до n-1, а не до n? и что за переменная nn? Может выложите более полный вариант)))
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Старый 24.06.2009, 20:27   #5
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

Код:
void newt::lnsrch(int n, std::vector <double> &xold, double fold, std::vector <double> &g, std::vector <double> &p, std::vector <double> &x,double *f, double stpmax, int *check,std::vector <double> &concentration)

{
  	int i;

	double a,alam,alam2,alamin,b,disc,f2,fold2,rhs1,rhs2,slope,sum,temp,

		test,tmplam;



	*check=0;

	for (sum=0.0, i=0; i<n; i++)
         {  
           sum += p[i]*p[i];
         }

	sum=sqrt(sum);

	if (sum > stpmax)
         {

            for (i=0; i<n; i++)
             {
                p[i] *= stpmax/sum;
             }
         }
	for (slope=0.0, i=0; i<n; i++)
         {
        	slope += g[i] * p[i];
         } 
        if (slope>=0.0) printf("Roundoff problem in lnsrch = %lf \n",slope);


	test=0.0;

	for (i=0; i<n; i++)
         {

		temp = fabs(p[i])/FMAXnewt(fabs(xold[i]),1.0);
		if (temp > test)
                 {
                   test = temp;
                 }

	}

	alamin = TOLXnewt/test;
 	alam = 1.0;

           for (;;) {
		for (i=0; i<n; i++)
                  {  
                    x[i] = xold[i] + alam * p[i] /* 1e-3*/;
                  }

               //Test pour x[i]
                for (i = 0; i < n-1; i++)
                 {
                   if (x[i] <= 0)
                     { 
                        printf("x<=0!\n");
                        while(x[i]<0)
                         {
                           int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k + 1;
                        }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                   else if (x[i] >= 1)
                     {
                        printf ("x>=1\n");
                        while (x[i]>1)
                         {
                          int k = 0;
                           x[i] = xold[i] + alam * p[i] * pow((1.e-1),k);
                           k = k+1;
                         }
                        for (int i = 0; i < nn; i++){
                        printf ("x = %g \n",x[i]);}
                     }
                 }
                *f = fmin(x,concentration);
		if (alam < alamin)
                {
			for (i = 0; i<n; i++)
                        {
                           x[i]=xold[i];
                        }
                          printf("alam<alamin\n");

			  *check=1;

			  return;

		}
                else if (*f <= fold+ALFnewt*alam*slope/*1e-3*/)
                {
                 printf("minimum\n");
                 return;
                }

		else {  
                                                                        

			if (alam == 1.0)
                             {

				tmplam = -slope/(2.0*(*f - fold - slope));printf ("alam = 1!\n");
                                printf ("*f = %g fold = %g slope = %g \n",*f,fold,slope);
                                for (int i = 0; i < nn; i++){
                                printf ("x = %g \n",x[i]);}return;
                             }

			else  {
                                printf ("alam!=1!\n");

				rhs1 = *f - fold - alam * slope;

				rhs2=f2 - fold2 - alam2 * slope;

				a=(rhs1/(alam * alam) - rhs2/(alam2 * alam2))/(alam - alam2);

				b=(-alam2 * rhs1/(alam * alam) + alam * rhs2/(alam2 * alam2))/(alam - alam2);

				if (a == 0.0){
                                    tmplam = -slope/(2.0 * b);printf ("alam=0\n");
                                 }

				else {
                                        printf ("koren'\n");

					disc=b * b - 3.0 * a * slope;

					if (disc<0.0)
                                        {
                                           tmplam = 0.5 * alam;
                                           printf("net kornei\n");
                                        }
                                        else if (b<=0.0)
                                        {
                                           tmplam=(-b + sqrt(disc))/(3.0 * a);
                                             printf ("KU>0!\n");
                                        }  

					else
                                        {

                                           tmplam= -slope/(b + sqrt(disc));
                                           printf ("KU<0!\n");
                                        }

				}

				if (tmplam > (0.5 * alam))
                                   {

					tmplam=0.5 * alam;
                                        printf ("Net KU!\n"); 
                                   }

			}

		}

		alam2 = alam;

		f2 = *f;

		fold2 = fold;

		alam = FMAXnewt(tmplam,0.1*alam);
       	}
}
ciaonataha вне форума Ответить с цитированием
Старый 24.06.2009, 20:29   #6
ciaonataha
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 150
По умолчанию

nn -это размер вектора x[i]
for (i = 0; i < nn-1; i++)
{
я ввожу ограничения, что все значения вектора x[i], за исклучением последнего долгни находится в пределе 0<x<1
}
ciaonataha вне форума Ответить с цитированием
Старый 25.06.2009, 00:58   #7
assasin
Форумчанин
 
Регистрация: 27.04.2009
Сообщений: 123
По умолчанию

Цитата:
Сообщение от ciaonataha Посмотреть сообщение
nn -это размер вектора x[i]
for (i = 0; i < nn-1; i++)
{
я ввожу ограничения, что все значения вектора x[i], за исклучением последнего долгни находится в пределе 0<x<1
}
А где она объявлена здесь? Простите, елси что, просто пытаюсь разобраться
<= P.S. если я тебе помог нажми весы слева <=
assasin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цикл if... then..else DeDoK Общие вопросы Delphi 8 11.10.2008 11:31
Цикл For Each Bu$ter Microsoft Office Excel 5 24.09.2008 16:49
Цикл Sota Паскаль, Turbo Pascal, PascalABC.NET 1 24.03.2008 19:50
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34