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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Владимир***
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 18
#1

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

27.06.2012, 17:08. Просмотров 735. Ответов 5
Метки нет (Все метки)

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");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2012, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можите найти ошибку в методе простых итераций он не расчитывает кубический корень (C++):

Найти корень уравнения методом итераций - C++
Нужно написать программу, которая будет находить корень уравнения x^3+2x^2+x-1=0 методом итераций. Помогите пожалуйста.

Найти корень уравнения и количество итераций - C++
Найти корень уравнения, но нужно ещё количество итераций, не получается! #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; ...

Посчитать количество проведенных итераций (метод простых итераций, Pascal -> C++) - C++
перевести из паскаля в С++ program method_of_simple_iteration; uses crt; var a:array of real; b,c:array of real; ...

Кубический корень - C++
Как в C++ получить кубический корень числа?

Кубический корень в программе - C++
Как написать в программе кубический корень из какого либо числа. Если квадратный sqrt, тогда кубический как? Пожалуйста кто знает

Как написать корень кубический - C++
Вот пишу... pow(x, 1/3) - в результате всегда выдает единицу. pow(x, 1.0/3.0) - ошибка. pow(x, 1.0/3) - ошибка Как еще можно...

5
Catstail
Модератор
22736 / 11105 / 1797
Регистрация: 12.02.2012
Сообщений: 18,302
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 / 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 минуту
скорее всего у меня неправильно составлен метод итераций, помогите пожалуйста исправить
0
Catstail
Модератор
22736 / 11105 / 1797
Регистрация: 12.02.2012
Сообщений: 18,302
27.06.2012, 17:59 #4
Как я понял из этого кода, кубическое уравнение решается по ф-лам Кардано? Но это - не итерационный метод. Так надо решить кубическое уравнение?
0
Владимир***
0 / 0 / 0
Регистрация: 11.03.2012
Сообщений: 18
27.06.2012, 18:04  [ТС] #5
Catstail: f=a*x*x*x+b*x+c+x , вот это уравнение

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

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

C++
1
x1=fun1(k,x0,a,b,c);
Вообще метод простой итерации очень капризен и часто расходится.
1
27.06.2012, 20:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 20:31
Привет! Вот еще темы с ответами:

Выделить кубический корень из не целого числа - C++
Ребят, нужна ваша помощь! Как выделить кубический корень из НЕ целого числа? P.S. pow(r,1/3) не работает.

Почему не извлекается кубический корень из отрицательного числа? - C++
продолжая тему проверьте пожалуйста скажите почему не работает? может такое быть что не извлекается кубический корень из отрицательного...

Найти количество итераций и корень уравнения методом простых итераций - C (СИ)
Помогите с программкой. Ну совсем никак. Даже не представляю что надо писать (чайник в Си). если кто знает как, пишите подробно,...

Для заданной матрицы в методе простых итераций найти q1 - Численные методы
Для заданной матрицы в методе простых итераций найти q1, если A=\begin{pmatrix}-0.01 &amp; 0.19 &amp; 0.4\\ 0.05 &amp; 0.3 &amp; -0.09\\ 0.7 &amp; 0 &amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru