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

Уравнение методом простых итераций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.78
Crookers
0 / 0 / 0
Регистрация: 06.09.2008
Сообщений: 3
07.09.2008, 17:37     Уравнение методом простых итераций #1
нужно решить уравнение x^3 - sinX = 0, методом простых итераций.
Я вроде все правильно сделал, но программа почему то зацикливается, в чем может быть проблема? Вот сама прога:
Код
#include <stdio.h>
#include <math.h>

int main(){
    float e=0.0001;//Точность
    float t;//abs |x-y|
    float x,y; //значение функции
    int n=0;//коллиество итераций

    x=0.5;
    printf("x%d=%f\n",n,x);
    do{
        y=((x*x*x)-sin(x));
        t=fabs(y-x);
        x=y;
        n++;
        printf("x%d=%f abs=%f\n",n,x,t);
    }while (t>e);

    printf("Корень:%f Число итераций:%d\n",x,n);

}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2217 / 732 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
07.09.2008, 17:41     Уравнение методом простых итераций #2
Цитата Сообщение от Crookers Посмотреть сообщение
Я вроде все правильно сделал, но программа почему то зацикливается
Вижу в этой фразе внутреннее противоречие=) прогони цикл в отладчике,посмотри,что не так
Crookers
0 / 0 / 0
Регистрация: 06.09.2008
Сообщений: 3
07.09.2008, 18:17  [ТС]     Уравнение методом простых итераций #3
А как его прогнать через отладчик, чтото не совсем понял..? работаю в Borland C++ 3.1
vetal-voyts
13 / 12 / 1
Регистрация: 23.08.2008
Сообщений: 43
07.09.2008, 20:33     Уравнение методом простых итераций #4

думаю надо изменить точность ,скажем 0.1, и продолжить исследования.
этот ряд может очень медленно сходиться.........

Добавлено через 1 час 21 минуту 8 секунд

тут проблема с математикой, а нес программированием. уточни метод на формальном уровне.
XuTPbIu_MuHTAu
Эксперт C++
 Аватар для XuTPbIu_MuHTAu
2217 / 732 / 10
Регистрация: 27.05.2008
Сообщений: 1,507
07.09.2008, 20:48     Уравнение методом простых итераций #5
Вообще,этот код,по-моему,не сильно связан с методом простых итераций...
vetal-voyts
13 / 12 / 1
Регистрация: 23.08.2008
Сообщений: 43
07.09.2008, 22:47     Уравнение методом простых итераций #6

для того, чтобы применить "метод" необходимо:

1. прикинуть где находятся корни, например графически

X^3=sin(X) - очевидно, что корнями будут : 0, 1, -1;

2. представить ур-е в виде х=arcsin(x^3), это ур-е даст нам первый риближенный
корень, (производная от х <1 на [-0.5; 0.5] )

3. теперь начинаем итерации Хо=0.5; X1=arcsin(Xo^3); X2=arcsin(X1^3) .......
до тех пор пока (Xn - Xn-1)>e, e-точность
ТеМы4
0 / 0 / 0
Регистрация: 09.10.2010
Сообщений: 6
09.10.2010, 14:17     Уравнение методом простых итераций #7
Помогите решить уровнения в С++
3.75+cos(x)+x-sin(3*x)
eps=1E-6
только через printf,scanf
ТеМы4
0 / 0 / 0
Регистрация: 09.10.2010
Сообщений: 6
12.10.2010, 17:39     Уравнение методом простых итераций #8
можите помочь с программой, что то она у меня циклит!
#include<iostream.h>
#include<math.h>
main()
{
const eps=1E-6;
float x0,x,f;
cout<<"x0=";
cin>>x0;
f=x0;
do
{
x=f;
f=3.75+cos(x)+x-sin(3*x);
}
while(abs(f-x)>=eps);
cout<<""<<x;
return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 18:28     Уравнение методом простых итераций
Еще ссылки по теме:

Система для решений уравнений методом простых итераций. C++
C++ Алгоритм написания для решения СЛАУ методом простых итераций
C++ Решение нелинейного уравнения методом простых итераций

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

Или воспользуйтесь поиском по форуму:
Blackstarr
1 / 1 / 0
Регистрация: 26.02.2011
Сообщений: 14
18.10.2011, 18:28     Уравнение методом простых итераций #9
// С++ Natal_Math_Mod_метод итераций.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <Windows.h>
using namespace std;



int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,j;
int k;

float V1,V2,V3,V4;

float MaxC;
float MaxE;
float devide[5];
float C[5];

float A[5][5];
float B[5][5];

float e[5];
float d[5];
Go_to:

for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
cout<<"Введите элементы матрицы А ["<<i<<"]["<<j<<"] ";
cin>>A[i][j];
}
//for(i=1;i<2;i++)
for(i=1;i<5;i++)
{
cout<<"Введите элементы матрицы d["<<i<<"] ";
cin>>d[i];
}

for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
if(i==j)
devide[i]=A[i][j];
//B[i][j]=(-A[i][j])/devide;
}

for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
B[i][j]=(-A[i][j])/devide[i];
}



//devide[4];
for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
if(i==j)
B[i][j]=0;


}

C[1]=(B[1][1]+B[1][2]+B[1][3]+B[1][4])*-1;
C[2]=(B[2][1]+B[2][2]+B[2][3]+B[2][4])*-1;
C[3]=(B[3][1]+B[3][2]+B[3][3]+B[3][4])*-1;
C[4]=(B[4][1]+B[4][2]+B[4][3]+B[4][4])*-1;

MaxC=C[1];
for(i=1;i<5;i++)
{
//MaxC=0;
if(MaxC<C[i])
MaxC=C[i];
}

if(MaxC>1)
{
system("cls");
goto Go_to;
}

for(i=1;i<5;i++)
{
e[i]=d[i]/devide[i];

}
MaxE=0;
for(i=1;i<5;i++)
{
if(MaxE<abs(e[i]))
MaxE=abs(e[i]);

}
//cout<<MaxE;

k=((log(0.0001)-log(MaxE)+log(1-MaxC))/log(MaxC))-1;

for(i=1;i<k;i++)
{
V1=B[1][2]*e[2]+B[1][3]*e[3]+B[1][4]*e[4];
e[1]=e[1]+V1;
V2=B[2][1]*e[1]+B[2][3]*e[3]+B[2][4]*e[4];
e[2]=e[2]+V2;
V3=B[3][1]*e[1]+B[3][2]*e[2]+B[3][4]*e[4];
e[3]=e[3]+V3;
V4=B[4][1]*e[1]+B[4][2]*e[2]+B[4][3]*e[3];
e[4]=e[4]+V4;

}


cout<<"Х1= "<<e[1]<<endl;
cout<<"Х2= "<<e[2]<<endl;
cout<<"Х3= "<<e[3]<<endl;
cout<<"Х4= "<<e[4]<<endl;

getch();
return 0;
}

Добавлено через 2 минуты
Задание: Написать программу которая бы вычисляла СЛАУ 4х4(х1,х2,х3,х4). Самая фишка в том, что программа должна вычислить корень с точностью 0.0001 и за определенное колличество итераций(k), колличество которых вычисляется по формуле k=((log(0.0001)-log(MaxE)+log(1-MaxC))/log(MaxC))-1(это единственная формула, которую я нашел, для вычислений итераций).

V1=B[1][2]*e[2]+B[1][3]*e[3]+B[1][4]*e[4];
e[1]=e[1]+V1;
V2=B[2][1]*e[1]+B[2][3]*e[3]+B[2][4]*e[4];
e[2]=e[2]+V2;
V3=B[3][1]*e[1]+B[3][2]*e[2]+B[3][4]*e[4];
e[3]=e[3]+V3;
V4=B[4][1]*e[1]+B[4][2]*e[2]+B[4][3]*e[3];
e[4]=e[4]+V4;

V1,V2,V3,V4-это вычисляют за 1 итерацию числа на которые нужно изменить корень e[n], чтобы приблизить к нужной точности!!! У меня получаются ОГРОМНЫЕ числа после 20 итераций, может я неправильно использую формулу вычесления итераций??? Иили что то другое??? (Вычислял за 1 итерацию корни были правильные!)

Матрица А:
6 , 0.7 , 0.5 , 0.8
0.6 , 11 , 3.4 , 1.3
1.5 , 1.2 , 5 , 0.3
1.5 , 0.3 , 0.7 , 10

Матрица d:
4
8
-11
8

Корни должны получиться: Х1=0.6146,Х2=1.453,Х3=-2.784,Х4=0.85913
Yandex
Объявления
18.10.2011, 18:28     Уравнение методом простых итераций
Ответ Создать тему
Опции темы

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