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

Решить функцию методом Ньютона - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
17.10.2012, 17:21     Решить функцию методом Ньютона #1
Нужно решить функцию методом Ньютона http://www.cyberforum.ru/cgi-bin/latex.cgi?0.1 x^2 - x \ln \,x=0. Отрезок содержащий корень [1;2]. Точное значение должно выдать 1,1183. Но моя прога выдает -1.#IND
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>  // для setprecision
#include <cmath> // для pow и log
 
using namespace std;
double Rech1(double x)
{
    return 0,1*pow(x,2)-x*log10(x);  // начальная
}
double Rech2(double x)
{
    return 0,1*pow(x,2)-x*log10(x);           //Производная
}
void main()
{
    double x = 2, x0 = 1;
    double e = 0.0001;
    do
    {
        x0 = x;
        x = x0 - Rech1(x)/Rech2(x);
    }
    while (fabs(x0-x)>e);
    cout << setprecision (6)<<x;
 
  system("pause");
  
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
17.10.2012, 17:32     Решить функцию методом Ньютона #2
Странно, функция и ее производная - одно и то же? Тем более там вроде вторая производная тоже нужна.
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
17.10.2012, 17:36     Решить функцию методом Ньютона #3
Такая ошибка это или деление на 0 или извлечение корня из отрицательного числа.
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
17.10.2012, 18:41  [ТС]     Решить функцию методом Ньютона #4
В том коде производная неправильная
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
double Rech1(double x)
{
    return 0,1*pow(x,2)-x*log10(x);  // начальная
}
double Rech2(double x)
{
    return 0.2*x - log(x) - 1;           //Производная
}
void main()
{
    double x = 2, x0 = 1;
    double e = 0.0001;
    do
    {
        x0 = x;
        x = x0 - Rech1(x)/Rech2(x);
    }
    while (fabs(x0-x)>e);
    cout << setprecision(6)<<x;
 
  system("pause");
 
}
Добавлено через 1 час 4 минуты
Цитата Сообщение от David Sylva Посмотреть сообщение
Такая ошибка это или деление на 0 или извлечение корня из отрицательного числа.
В каком месте?
David Sylva
 Аватар для David Sylva
1281 / 943 / 51
Регистрация: 17.05.2012
Сообщений: 2,686
17.10.2012, 18:45     Решить функцию методом Ньютона #5
Цитата Сообщение от иван_пропал Посмотреть сообщение
В каком месте?
Я не знаю в каком месте, я говорю в принципе, обычно при такой ошибке выдаёт -1.#IND
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
17.10.2012, 19:01     Решить функцию методом Ньютона #6
Не обязательно деление на 0, например еще логарифм отрицательного числа.
иван_пропал, это кстати по отладке заметно. Сначала число x становится все больше, а затем отрицательным, далее на этой итерации вылет. Мой совет: подробнее изучить алгоритм. И обратить внимание на вторую производную, которой здесь нет.
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
18.10.2012, 10:20  [ТС]     Решить функцию методом Ньютона #7
BumerangSP обратил я внимание и изучил поподробнее метод. Исправил код, но все же выдает 3,4...
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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
double Rech1(double x)
{
    return 0,1*pow(x,2)-x*log10(x);  // начальная
}
double Rech2(double x)
{
    return 0.2*x - log(x) - 1;           //Производная
}
double Rech3(double x)
{
    return 0.2 - 1/x;           //2я Производная
}
void main()
{
    double x , x0 = 1.5; //x0 приближенное значение корня
    double e = 0.0001;
    do
    {
        
        x = x0-(Rech1(x0)/Rech2(x0));
        x0 = x;
        cout<<x<<"\n";
 
    }
    while (abs(x-x0)<=e && (Rech1(x0)*Rech3(x0))>0);
    cout << setprecision(6)<<x;
 
  system("pause");
 
}
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
18.10.2012, 10:37     Решить функцию методом Ньютона #8
иван_пропал, не правильно посчитана 1 производная, ну и следовательно 2
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
18.10.2012, 13:20  [ТС]     Решить функцию методом Ньютона #9
doctor_lecter посчитал будет 0.2*x - log10(x) - 1
Изменил программу теперь она выводит без конца 1,37.... то есть не может выйти из цикла. Я думаю сдесь нужно применить указатель но чет не получается...
Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
double Rech1(double x)
{
    return 0.1*pow(x,2)-x*log10(x);  // начальная
}
double Rech2(double x)
{
    return 0.2*x - log10(x) - 1;           //Производная
}
double Rech3(double x)
{
    return 0.2 - 1/x;           //2я Производная
}
void main()
{
    double x , x0 = 1.5; //x0 приближенноу значение корня
    double e = 0.0001;
 
    do
    {
        
        x = x0-(Rech1(x0)/Rech2(x0));
        x0 = x;
        cout<<x<<"\n";
 
    }
    while (abs(x-x0)<=e && (Rech1(x0)*Rech3(x0))>0);
    cout << setprecision(6)<<x;
 
  system("pause");
 
}
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
18.10.2012, 13:47     Решить функцию методом Ньютона #10
Цитата Сообщение от иван_пропал Посмотреть сообщение
0.2*x - log10(x) - 1
Это то же не правильно. И вторую производную надо пересчитать.
А зацикливается потому что у вас на каждой итерации x=x0

Добавлено через 10 минут
А у вас в исходной функции логарифм натуральный или десятичный?
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
18.10.2012, 16:14  [ТС]     Решить функцию методом Ньютона #11
Цитата Сообщение от doctor_lecter Посмотреть сообщение
А у вас в исходной функции логарифм натуральный или десятичный?
ln то есть 10, а производные верные. А то что x0=x это должно быть так а то как иначе бедет меняться x0 чтобы приближаться к корню уравнения.

Добавлено через 2 минуты
Цитата Сообщение от doctor_lecter Посмотреть сообщение
А у вас в исходной функции логарифм натуральный или десятичный?
там написано ln я подразумеваю что это логарифм по основанию 10. А то что x0=x это должно быть так а то как иначе будет меняться x чтобы приближаться к корню уравнения.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
18.10.2012, 16:19     Решить функцию методом Ньютона #12
иван_пропал, исходная функция такая?
http://www.cyberforum.ru/cgi-bin/latex.cgi?0,1*{x}^{2}-x*ln(x)
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
18.10.2012, 16:22     Решить функцию методом Ньютона #13
Цитата Сообщение от иван_пропал Посмотреть сообщение
ln то есть 10
ln - натуральный логарифм, lg - десятичный.
0.2*x - log10(x) - 1 - не верно ни для ln, ни для lg
0.2*x - log(x) - 1; - верно для ln
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
18.10.2012, 16:23     Решить функцию методом Ньютона #14
иван_пропал, ln - это log, не log10.
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
18.10.2012, 16:23     Решить функцию методом Ньютона #15
Цитата Сообщение от иван_пропал Посмотреть сообщение
А то что x0=x это должно быть так а то как иначе бедет меняться x0 чтобы приближаться к корню уравнения
У в конце каждой итерации получится что x=x0, и abs(x-x0) = 0
BumerangSP
18.10.2012, 16:24
  #16

Не по теме:

doctor_lecter, да, я все же хочу уточнить, что ТС имеет в виду.

иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
18.10.2012, 16:27  [ТС]     Решить функцию методом Ньютона #17
Цитата Сообщение от doctor_lecter Посмотреть сообщение
А у вас в исходной функции логарифм натуральный или десятичный?
В задании написано lnx я подразумеваю что это логарифм по основанию 10.
Производные верные. А то что x0=x это должно быть так а то как иначе бедет меняться x0 чтобы приближаться к корню уравнения.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
18.10.2012, 16:28     Решить функцию методом Ньютона #18
1-ая производная: 0.2*x-ln(x)-1
2-ая: 0.2-1/x
Все так, осталось убрать log10 отовсюду)
doctor_lecter
 Аватар для doctor_lecter
279 / 152 / 8
Регистрация: 22.09.2012
Сообщений: 283
18.10.2012, 16:31     Решить функцию методом Ньютона #19
Цитата Сообщение от иван_пропал Посмотреть сообщение
Производные верные. А то что x0=x это должно быть так а то как иначе бедет меняться x0 чтобы приближаться к корню уравнения.
Какие конкретно? И в любом случае саму функцию надо переписать.
0.2*x - log(x) - 1 - это если у вас ln
если lg - то производная будет такая: 0.2*x - log10(x) - 1/log(10)
А цикл правильно организовать так: сначала x0 = x; потом вычисление нового x
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2012, 16:34     Решить функцию методом Ньютона
Еще ссылки по теме:

C++ Решение СНАУ методом Ньютона
Функция Арксинус методом Ньютона C++
C++ Интерполяция методом Ньютона и Лагранжа

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

Или воспользуйтесь поиском по форуму:
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
18.10.2012, 16:34  [ТС]     Решить функцию методом Ньютона #20
задание http://www.fayloobmennik.net/2286701
Yandex
Объявления
18.10.2012, 16:34     Решить функцию методом Ньютона
Ответ Создать тему
Опции темы

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