2015-04-22 5 views
-9

моя программа получает бесконечный цикл, и мне нужно лучшее решение.Бесконечная петля

Функция, которая у меня есть, действительно связана друг с другом, поэтому это может быть сложно увидеть.

где дт = 0,04, дх = 1, а = 0,7, Ь = 0,4

вопросы является поиск р (х, т + 1) нужно р (х, т), р (х-1 , t) и p (x + 1, t) также случается с другой функцией.

public partial class Form1 : Form 
{ 
    double a,b,dt,dx; 

    public void JudulKolom() //to print in table, cause I planned to make p,q,n graphic using zedGraph 
    { 
     listView1.Columns.Add("t").Width =100; 
     listView1.Columns.Add("x").Width =100; 
     listView1.Columns.Add("p(x,t)").Width =100; 
     listView1.Columns.Add("q(x,t)").Width =100; 
     listView1.Columns.Add("n(x,t)").Width =100; 
     listView1.Columns.Add("r(x,t)").Width =100; 
     listView1.Columns.Add("c(x,t)").Width =100; 
     listView1.Columns.Add("f(c)").Width =100; 
     listView1.Columns.Add("g(c)").Width =100; 
     listView1.Columns.Add("h(c)").Width =100; 
    } 

    //fungsi p(x,t)   
    double fP (int x, double t) 
    { 
     double hasil = 0; 
     a = Convert.ToDouble(textBoxAlfa.Text); 
     if (t == 0) //for every t=0 and any x 
     { 
      hasil = 0.01 * Math.Exp(-0.1 * x); 
     } 
     else //for t=0.04 or t+1 
     {    
      if (x > 0) //for p when x=1..10 and t=0.04 
      { 
       hasil = fP(x,t-dt) + fD() * (fP(x+1,t-dt) - 2 * fP(x,t-dt) + fP(x-1,t-dt)) + 
         dt * fG(x,t-dt) * (1 - fR(x,t-dt)) - fF(x,t-dt) * fP(x,t-dt) + fP(x,t-dt) * Math.Sqrt(dt) * wiener(x);   
      } 
      else if (x == 0) //only for p when x=0 and t=0.04 
      { 
       hasil = fP(x,t-dt) + fD() * (fP(x+1,t-dt) - 2 * fP(x,t-dt) + fP(x,t-dt)) + 
         dt * fG(x,t-dt) * (1 - fR(x,t-dt)) - fF(x,t-dt) * fP(x,t-dt) + fP(x,t-dt) * Math.Sqrt(dt) * wiener(x); 
      } 
     } 

     return Math.Round(hasil, 6); 
    } 

    //fungsi q(x,t) 
    double fQ (int x, double t) 
    { 
     double hasil = 0; 
     if (t == 0) //for every q when t=0 and any x 
     { 
      hasil = 0; 
     } 
     else 
     { 
      if (x > 0) //for q when x=1..10 and t=0.04 
      { 
       hasil = fQ(x,t-dt) + fD() * (fQ(x+1,t-dt) - 2*fQ(x,t-dt) + fQ(x-1,t-dt)) + 
         dt * fF(x,t-dt) * fP(x,t-dt) - 
         (0.5 * fF(x,t-dt)) * fQ(x,t-dt); 
      } 
      else if (x == 0) //only for q when x=0 and t=0.04 
      { 
       hasil = fQ(x,t-dt) + fD() * (fQ(x+1,t-dt) - 2*fQ(x,t-dt) + fQ(x,t-dt)) + 
         dt * fF(x,t-dt) * fP(x,t-dt) - 
         (0.5 * fF(x,t-dt)) * fQ(x,t-dt); 
      } 
     } 
     return Math.Round(hasil, 6); 
    } 

    //fungsi n(x,t) 
    double fN (int x, double t) 
    { 
     double hasil=0; 
     if (t == 0) //for every n when t=0 and any x 
     { 
      hasil = 0; 
     } 
     else 
     { 
      if (x > 0) //only for n when x=1..10 and t=0.04 
      { 
       hasil = fN(x,t-dt) + dt * (0.5 * fF(x,t-dt)) * fQ(x,t-dt); 
      } 
      else if (x == 0) //only for n when x=0 and t=0.04 
      { 
       hasil = fN(x,t-dt) + dt * (0.5 * fF(x,t-dt)) * fQ(x,t-dt); 
      }     
     } 
     return Math.Round(hasil, 6); 
    } 

    //fungsi r(x,t) 
    double fR (int x, double t) 
    { 
     double hasil = 0; 

     hasil = fP(x,t) + fQ(x,t) + fN(x,t); //for every any x and t 

     return Math.Round(hasil, 6); 
    } 

    //fungsi c(x,t) 
    double fC (int x, double t) 
    { 
     double hasil = 0; 
     a = Convert.ToDouble(textBoxAlfa.Text); 
     if (t == 0) //for every C when t=0 and any x 
     { 
      hasil = ((1.0 * 10)/(10 + fP(x,t)))*(1.0 - a * fR(x,t)); //the matter is the R function that I have to use fR value in fC(c,t=0) when I look for fC(x,t=0.04) 
     } 
     else if (t != 0) //for every C when t is not 0 and any x 
     { 
      hasil = ((1.0 * 10)/(10 + fP(x,t-dt)))*(1.0 - a * fR(x,t-dt)); 
     } 
     return Math.Round(hasil, 6); 
    } 

    //fungsi f(c) 
    double fF (int x, double t) 
    { 
     double hasil = 0; 
     if (t == 0) //for every F when t=0 and any x 
     { 
      hasil = 0.5 * (1-Math.Tanh(4 * fC(x,t) - 2)); 
     } 
     else if (t != 0) //for every F when t is not 0 and any x 
     { 
      hasil = 0.5 * (1-Math.Tanh(4 * fC(x,t-dt) - 2)); 
     }   
     return Math.Round(hasil, 6); 
    } 

    //fungsi g(c) 
    double fG (int x, double t) 
    { 
     double hasil = 0; 
     b = Convert.ToDouble(textBoxBeta.Text); 
     if (t == 0) //for every G when t=0 and any x 
     { 
      hasil = b * Math.Exp(b * fC(x,t)); 
     } 
     else if (t != 0) //for every G when t is not 0 and any x 
     { 
      hasil = b * Math.Exp(b * fC(x,t-dt)); 
     } 
     return Math.Round(hasil, 6); 
    } 

    //fungsi h(c) 
    double fH (double f) //only for q when x=0 and t=0.04 
    { 
     double hasil = 0; 
     hasil = 0.5 * f; 
     return Math.Round(hasil, 6); 
    } 

    double fD() 
    { 
     double hasil = 0; 
     hasil = 1.0 * dt/(dx * dx); 
     return Math.Round(hasil, 6); 
    } 

    double wiener (int x) 
    { 
     double hasil = 0, dt = 0.04, Pi = 3.14159265358979;  
     hasil = 1.0/Math.Sqrt(2 * Pi * dt) * Math.Exp(-1.0 * Math.Pow(x,2)/(2 * dt)); 
     return Math.Round(hasil, 6); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (textBoxAlfa.Text == "" || textBoxBeta.Text == "" || tbXvalue.Text == "" || tbTvalue.Text == "") 
     { 
      MessageBox.Show("Semua input harus diisi angka!"); 
     } 
     else 
     { 
      double p=0,q=0,n=0; 
      double r,a,c,f,g,h,t; 
      int x; 

      a = Convert.ToDouble(textBoxAlfa.Text);   
      b = Convert.ToDouble(textBoxBeta.Text);    
      t = Convert.ToDouble(tbTvalue.Text); 
      x = Convert.ToInt32(tbXvalue.Text); 

      dt=0.04; 
      dx=1; 

      int indeks=-1; 
     while (t<=0.08) 
     { 
      x = 0; 
      for(int i=0; i<=10; i++) 
      { 
       listView1.Items.Add(t.ToString()); 
       indeks=indeks+1; 

         p=fP(x,t); 
         q=fQ(x,t); 
         n=fN(x,t); 
         r=fR(x,t); 
         c=fC(x,t); 
         f=fF(x,t); 
         g=fG(x,t); 
         h=fH(f); 

       listView1.Items[indeks].SubItems.Add(x.ToString()); 
       listView1.Items[indeks].SubItems.Add(p.ToString()); 
       listView1.Items[indeks].SubItems.Add(q.ToString()); 
       listView1.Items[indeks].SubItems.Add(n.ToString()); 
       listView1.Items[indeks].SubItems.Add(r.ToString()); 
       listView1.Items[indeks].SubItems.Add(c.ToString()); 
       listView1.Items[indeks].SubItems.Add(f.ToString()); 
       listView1.Items[indeks].SubItems.Add(g.ToString()); 
       listView1.Items[indeks].SubItems.Add(h.ToString()); 
      } 
      t=t+0.04;     
      JudulKolom(); 
     } 
    } 
} 
+0

Что такое петля бесконечно? Вы пытались установить контрольные точки? – Sayse

+0

Ваш код очень грязный. Подумайте о том, чтобы очистить его и дать некоторые комментарии, когда ситуация может осложниться. Как и сейчас, ваш единственный цикл while не должен быть бесконечным, так как вы увеличиваете 't'. –

+0

Я не вижу бесконечных циклов в вашем коде. Но в ваших методах можно вычислить f * -функции в бесконечной рекурсии. Используйте отладчик, чтобы узнать, что происходит. –

ответ

0

Вы не должны сравнивать числа с плавающей запятой путем приравнивания. Вы должны разрешить некоторую неточность. что-то вроде if (Math.Abs(a - b) < epsilon) {} Измените свою проверку if (t == 0) на if (Math.Abs(t) < 0.00001) или на какое-то небольшое количество.

Я думаю, dt в ваших формулах для этого.

+0

спасибо, я пробовал, но, к сожалению, ничего не изменилось :( – Timoth

+0

Попробуйте найти, какая часть кода вызывает цикл. Удалите вычисления и возвращайте постоянное значение из большинства внутренняя функция (которая не вызывает другие функции). Дайте читаемые имена переменным. – Orifjon