Кто-нибудь может мне помочь с циклом моей программы (GAUSS SEIDEL METHOD)? - PullRequest
0 голосов
/ 18 марта 2012

Пользователь введет 2 уравнения, затем решит их итерацию (извините за мой английский).Проблема в том, что цикл не выполняется.Код должен начинаться, когда значение et меньше значения g.

Код:

#include <iostream>
#include<stdlib.h>
using namespace std;

 long double g=0.0010;
 int main()
 {

    long double xe,ye,et,k,x,y,x1,x2,y1,y2,c1,c2,a,b;
    //for the input
    cout<<"EQUATION 1:\n";
    cout<<"Input your desired numerical coefficient for x:"<<endl;
    cin>>x1;
    cout<<"Input your desired numerical coefficient for y:"<<endl;
    cin>>y1;
    cout<< "Input your constant's value:"<<endl;
    cin>>c1;
    system("CLS");
    cout<<"EQUATION 2:\n";
    cout<<"Input your desired numerical coefficient for x:"<<endl;
    cin>>x2;
    cout<<"Input your desired numerical coefficient for y:"<<endl;
    cin>>y2;
    cout<< "Input your constant's value:"<<endl;
    cin>>c2;
    system("CLS");
    //to show the equation made
    cout<<"Your EQUATION 1 is:\n"<<x1<<"x + <"<<y1<<"y)"<<" = "<<c1<<endl<<endl;
    cout<<"Your EQUATION 2 is:\n"<<x2<<"x + ("<<y2<<"y)"<<" = "<<c2<<endl<<endl;

    //first value of x and y
    x=c1/x1;
    y=(c2)/y2;
    //show the values
    cout<<"\nx="<<x<<endl;
    cout<<"y="<<y<<endl;
    //this is where the iteration starts
    for(k=1;g>et;k++)
{

    a=(c1+y)/x1;
    b=(c2-x)/y2;
    xe=((a-y)/a)*-1;
    ye=((b-x)/b);
    et=((xe+ye)/2);
    cout<<"k="<<k;
    cout<<"\nx="<<a<<endl;
    cout<<"y="<<b<<endl;
    cout<<"\nxe="<<xe;
    cout<<"\nye="<<ye;
    cout<<"\net="<<et<<endl;
    }


    return 0;

    }

Ответы [ 2 ]

0 голосов
/ 18 марта 2012

Вы должны использовать больше пробелов, чтобы было легче видеть, что вы делаете.Серьезно, это главная проблема.

Условие завершения должно быть, когда ошибка максимум ниже определенного предела, потому что тогда все переменные сошлись "достаточно".Таким образом, вы берете сумму скоростей изменений, которые могут привести к преждевременному прекращению, если они имеют противоположный знак, или к неравномерной степени сходимости в противном случае.потому что в общем случае они могут перескочить и поменять знак.

0 голосов
/ 18 марта 2012

Если вы не используете

while (std::abs(et) > g)

или что-то в этом роде?

...