Форум программистов, компьютерный форум CyberForum.ru

Можите найти ошибку в методе простых итераций он не расчитывает кубический корень - C++

Восстановить пароль Регистрация
 
Владимир***
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 18
27.06.2012, 17:08     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<fstream>
usingnamespace std;
 
floatfun1(int num,float x,float a,float b,float c){
    float f;
    switch (num){
        case 1:f=a*x*x*x+b*x+c+x;break;
        case 2:f=a*cos(x+b)+c+x;break;
        case 3:f=a*log(fabs(x+b))+c+x;break;
    }
 
        return f;
}
 
voidMi(float x2,float x,float eps,float x0,float x1,float a,float b,float c,float k){
        int m;
 
              m=0;                                //количествоитераций
 
              x=x0;                                //устанавливаемначальноезначениеаргумента
 
        do{                                    //запускаемитерационныйпроцесс
 
              x2=x;
 
              m++;
 
     }
 
        while(fabs(x1-x)>eps);                        //условиевыхода – достигнутатребуемаяточность
 
        }
 
 
floatkardano(float a0, float a2, float a3,int n,float x0)
{
float z1,z2,aa,a,b,c,Q,g;
if (n==1)
  {
if (a0==0)
    {
       g=-(a3/a2);
    }
else
    {
    b=a2/a0;
    c=a3/a0;
    Q=(c*c)/4+(b*b*b)/27;
if (Q<0)
    {
      g=-x0;
 
return 0;
    }
 
    a=sqrt(Q)-(c/2);
            if (a<=0)
            {
                z1=-(exp((1/3)*log(-a)));
            }
            if (a==0)
                        {
                            z1=0;
                        }
            if (a>0)
            {
                z1=exp((1/3)*log(a));
            }
      aa=-(sqrt(Q)+(c/2));
            if (aa<=0)
            {
                z2=-(exp((1/3)*log(-aa)));
            }
            if (aa==0)
                        {
                            z2=0;
                        }
            if (aa>0)
            {
                z2=exp((1/3)*log(aa));
            }
 
      g=z1+z2;
    }
  }
if ((n==2)||(n==3))
  {
      g=x0;
 
  }
return g;
}
 
intmain(){
 
    float a,b,c,x0,x1,eps;
int i,k,num;
ofstream myfile;
    ofstream myfile1;
    myfile.open ("grafik.txt", ios::out);                  //созданиетекстовогофайла
    myfile.setf(ios::fixed);
    myfile.precision(2);
 
                cout<<"VasprevetsutvuetprogrammadlyanahojdeniyakornyauravneniyzmetodomIteracii: \n";
                cout<<"1.f(x)=a*x*x*x+b*x+c+x"<<endl;
                cout<<"2.f(x)=a*cos(x+b)+c+x"<<endl;
                cout<<"3.f(x)=a*log(fabs(x+b))+c+x"<<endl;
 
                cout<<"Viberitenomerfunkcii:"<<endl;
 
    while(num!=1&&num!=2&&num!=3)
        {while(!(cin>>num)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
                k=num;
 
                cout<<"\n Viberetesposobvvodadannix \n 1. S klaviaturi: \n 2. Izfayla: \n";
                int s=0;
        while (s!=1&&s!=2){{while(!(cin>>s)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
 
          }
        if (s==1){
 
       cout<<"Vvedite zna4enia koefficientov \n";
       cout<<"Vvedite zna4enie a = "; {while(!(cin>>a)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
           cout<<"Vvedite zna4enie b = "; {while(!(cin>>b)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
       cout<<"Vvedite zna4enie c = "; {while(!(cin>>c)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
       cout<<"Vvedite zna4enie x0 = "; {while(!(cin>>x0)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
       cout<<"Vvedite pogreshnost'eps = "; {while(!(cin>>eps)){
            cin.clear();
        while(cin.get()!='\n')
            continue;
        cout<<"Vi zadalinekorektnoechislo,poprobuytesnova:";
                }
    }
 
               }
if (s==2){
 
    ifstream ifs("11.txt");                   //указываемнаимяфайла
    cin.rdbuf(ifs.rdbuf());
    cin>>a>>b>>c>>eps>>x0;                    //считалиизфайлапеременные
 
                cout<<"Koefficientikotoriesoderjatsya v fayle:\n";
 
                cout<<"a="<<a<<endl;
                cout<<"b="<<b<<endl;
                cout<<"c="<<c<<endl;
                cout<<"eps="<<eps<<endl;
                cout<<"x0="<<x0<<endl;
 
                    ifs.close();
 
           }
            x1=fun1(k,x0,a,b,c);                         //подсчитываемочередное x2
 
                cout<<"KorenuravnenyapometoduIteraciy="<<x1<<endl;
                cout<<"Tocnoeznachenieuravneniya="<<x1<<endl;
 
float tx,mx,y[500];
          mx=0.2;
              tx=-10;
 
for(i=0;i<=10;i++)
           { y[i]=fun1(k,tx,a,b,c);
tx=tx+mx;
 
 
myfile<<tx<<" "<<y[i]<<"\n"<<endl;    //записываетточки в график
}
          myfile.close ();
 
 
return 0;
system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2012, 17:08     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень
Посмотрите здесь:

C++ Вычислить методом итераций корень уравнения
C++ Кубический корень
Метод простых итераций C++
Найти корень уравнения и количество итераций C++
Почему не извлекается кубический корень из отрицательного числа? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21450 / 10235 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
27.06.2012, 17:54     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #2
Метод итераций работает так: если ищется решение уравнения вида f(x)=0 и функцию f можно привести к виду f(x)=g(x)-x, то уравнение f(x)=0 эквивалентно уравнению x=g(x). Берем начальное значение x0, вычисляем x1=g(x0) и т.д. до тех пор, пока |xn-xn-1| не станет меньше заданного эпсилон. Но метод может и не сойтись...


А в коде - полная каша. Какое уравнение нужно решить?
Владимир***
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 18
27.06.2012, 17:58  [ТС]     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
voidMi(float x2,float x,float eps,float x0,float x1,float a,float b,float c,float k){
int m;
 
m=0;     //количествоитераций
 
x=x0;    //устанавливаемначальноезначениеаргумента
 
do{  //запускаемитерационныйпроцесс
 
 x1=fun1(k,x0,a,b,c);                       //подсчитываем очередное x1
 
x2=x;
 
m++;
 
}
 
while(fabs(x1-x)>eps);   //условиевыхода – достигнутатребуемаяточность
 
}
 
 
floatkardano(float a0, float a2, float a3,int n,float x0)
{
float z1,z2,aa,a,b,c,Q,g;
if (n==1)
{
if (a0==0)
{
g=-(a3/a2);
}
else
{
b=a2/a0;
c=a3/a0;
Q=(c*c)/4+(b*b*b)/27;
if (Q<0)
{
g=-x0;
 
return 0;
}
 
a=sqrt(Q)-(c/2);
if (a<=0)
{
z1=-(exp((1/3)*log(-a)));
}
if (a==0)
{
z1=0;
}
if (a>0)
{
z1=exp((1/3)*log(a));
}
aa=-(sqrt(Q)+(c/2));
if (aa<=0)
{
z2=-(exp((1/3)*log(-aa)));
}
if (aa==0)
{
z2=0;
}
if (aa>0)
{
z2=exp((1/3)*log(aa));
}
 
g=z1+z2;
}
}
if ((n==2)||(n==3))
{
g=x0;
 
}
return g;
}
Добавлено через 1 минуту
скорее всего у меня неправильно составлен метод итераций, помогите пожалуйста исправить
Catstail
Модератор
 Аватар для Catstail
21450 / 10235 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
27.06.2012, 17:59     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #4
Как я понял из этого кода, кубическое уравнение решается по ф-лам Кардано? Но это - не итерационный метод. Так надо решить кубическое уравнение?
Владимир***
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 18
27.06.2012, 18:04  [ТС]     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #5
Catstail: f=a*x*x*x+b*x+c+x , вот это уравнение

Добавлено через 3 минуты
Вообще все выше приведенные уравнения нужно решить методом простых итераций.Метод кардана я думал ввести чтобы он расчитывал кубический корень.ВОть))а выходит всякая ерунда
Catstail
Модератор
 Аватар для Catstail
21450 / 10235 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
27.06.2012, 20:31     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень #6
Понял. Немного подожди.

Добавлено через 1 час 48 минут
У тебя при вызове fun1 не фигурирует x (а только x0):

C++
1
x1=fun1(k,x0,a,b,c);
Вообще метод простой итерации очень капризен и часто расходится.
Yandex
Объявления
27.06.2012, 20:31     Можите найти ошибку в методе простых итераций он не расчитывает кубический корень
Ответ Создать тему
Опции темы

Текущее время: 23:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru