Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
1

Метод Ньютона (не могу понять одну вешь)

26.11.2014, 13:47. Просмотров 932. Ответов 7
Метки нет (Все метки)

Здравствуйте, дано задание по методам Ньютона. Его я уже сделал, но входе выполнения задания я очень много гуглил и нашел такой пример реализации
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
f = inline('sqrt(2-x^2) - exp(x)');           %сама функция
fdx = inline('-x/sqrt(2-x^2) - exp(x)');    %ee производная
 
a = 0;                %[a,b] отрезок, где находится корень
b = 1;
xa = a;
xb = b;
e =  1e-12;         %погрешность
i = 1;
while abs(xb) > e         %здесь не понятно
    p = f(xa);               %здесь понятно
    q = fdx(xa);
    
    xa = xa - p / q;         %здесь и 
    xb = p;                    %здесь тоже не понятно
    i = i+1;
end
xa
Ответ абсолютно верный, так как совпадает с ответом найденым методом бисекций.
Объясните места, которые я отметил.
Код найден тут, был реализован на PHP, я его плохо знаю, да к тому же при выполнени выводились ошибки и я решил переписать на Матлаб.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 13:47
Ответы с готовыми решениями:

Не могу понять почему не вызывается метод? Как вывести метод Plus?
namespace lesson3 { class Program { struct Complex { public double im;...

Не могу понять одну тонкость наследования
Добрый вечер! Не понимаю следующее: class base { }; class child : public base {

Не могу понять одну вещь в ряде Лорана
Кольца аналитичности | z | < 1, 1 < | z | < 3, | z | > 3. Раскладываем дробь на элементарные...

Не могу осилить метод Ньютона
Доброго времени суток, помогите пожалуйста, справиться с уравнением, которое нужно реализовать...

7
S_el
2336 / 1759 / 375
Регистрация: 15.12.2013
Сообщений: 7,262
26.11.2014, 15:16 2
4unkur, у вас вопрос по методу или реализации на Matlab?
0
4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
26.11.2014, 15:32  [ТС] 3
S_el, Вопрос именно по поводу этой реализации. Сам я сделал на С++.
Как вы можете видеть там x(i) = x(i-1) - f(x(i-1)/f'(x(i-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
double f(double x) {
    
    return ( sqrt (2 - x*x) - exp (x) );
}
 
double fdx(double x) {
    
    return ( -x / sqrt (2 - x*x) - exp(x) );
}
 
int main () {
 
    const double e = 1e-12;
 
    vector<double> x;
    x.push_back (0.3);
    int i = 1;
 
    do {
        
        x.push_back (x[i-1] - f(x[i-1]) / fdx(x[i-1]));
        cout << i << endl;
        ++i;
    } while (fabs (x[i-1] - x[i-2]) > e);
    
    cout << i << endl;
    cout << setprecision(20) << x[i-1] << endl;
это же на Матлабе?

0
S_el
2336 / 1759 / 375
Регистрация: 15.12.2013
Сообщений: 7,262
26.11.2014, 16:49 4
Цитата Сообщение от 4unkur Посмотреть сообщение
x(i) = x(i-1) - f(x(i-1)/f'(x(i-1))
Matlab M
1
2
3
4
5
...
p = f(xa); % xa соответствует x(i-1),p-f(x(i-1))
 q = fdx(xa);% производная в x(i-1)
 xa = xa - p / q; % вычисление x(i)
...
2
Зосима
5059 / 3405 / 345
Регистрация: 02.04.2012
Сообщений: 6,326
Записей в блоге: 16
Завершенные тесты: 1
26.11.2014, 21:09 5
Лучший ответ Сообщение было отмечено 4unkur как решение

Решение

*в Си я бы тоже советовал делать без массивов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main () {
 
    const double e = 1e-6;
 
    double xo xn;
    xa = 0.3; // предыдущее (начальное) значение х
    // xb - новое значение х
    int i = 1;
 
    do {
        xb = f(xa); // значение функции в текущей точке
        xa = xa - f(xa) / fdx(xa); // вся соль метода Ньютона!
        i++;
    } while (fabs (xb) > e); // пока значение функции не станет меньше погрешности
    
    cout << i << endl;
    cout << setprecision(20) << xa << endl;
1
4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
27.11.2014, 02:27  [ТС] 6
Зосима,
Цитата Сообщение от Зосима Посмотреть сообщение
while (fabs (xb) > e); // пока значение функции не станет меньше погрешности
Вот тут чуть-чуть не понятно. Почему сравнивается f(xi) > e если нужно сравнивать |x(i) - x(i-1)| < e ?

Добавлено через 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
int main () {
 
    const double e = 1e-12;
 
    
    double X0 = 0.3;
    double x1, x0 = X0;
    double p, q;
    double X1;
    int i=1;
    while (true) {
        
        p = f(x0);
        q = fdx(x0);
            
        x1 = x0 -  p/q;     
        ++i;
    
        if (fabs (x1 - x0) > e) {
            x0 = x1;
        }
        else {
            break;
        }
    }
    
cout << i << endl;
    cout << setprecision(20) << x0 << endl;
    
    
    return 0;
}
Добавлено через 25 секунд
не так элегантно, но работает

Добавлено через 14 минут
Понимаете, вчера я не мог решить эту задачу с использованием массивов на матлабе, поэтому написал на С++. Как вы видите там тоже были кое-какие ошибки и я найдя в интернете(точнее в википедии) готовую реализацию, использовал ее, подставив свои значения и функции. Все сработало, но учитель меня спросил, почему я сравниваю f(xi) < e, на что я не смог ответить(вобще то он и сам не понял). Пока я писал это сообщение, мне вбрело в голову сходить опять на википедию, где все это началось и с удивлением нашел что можно сравнивать и так и еще я заметил что вы писали код прямо здесь и допустили несколько ошибок. Но все равно теперь я все понял и всем большое спасибо!
0
Зосима
5059 / 3405 / 345
Регистрация: 02.04.2012
Сообщений: 6,326
Записей в блоге: 16
Завершенные тесты: 1
27.11.2014, 09:46 7
Цитата Сообщение от 4unkur Посмотреть сообщение
f(xi) < e
суть этого сравнения исходит из самого смысла решения уравнения - нахождения такого х, при котором ф-ция обращается в ноль или, как в данном примере, становится меньше допустимой погрешности.
можно и так и так задавать условия
1
4unkur
16 / 16 / 10
Регистрация: 16.06.2014
Сообщений: 180
27.11.2014, 14:04  [ТС] 8
Зосима, да спасибо теперь все понятно. Ты очень крут
0
27.11.2014, 14:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2014, 14:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

маткад выдает одну и ту же ошибку. не могу понять, что не так
при присвоении функциям А и В данных и дальнейших расчетах маткад выделяет А и пишет &quot;эта...

Не могу понять метод join()
public class j2 { public static void main(String args) { String fina1=String.join(&quot;Anton...

Не могу понять, как мне вызвать метод TwiceUsedWord() в WordsGen()...
Не могу понять, как мне вызвать метод TwiceUsedWord() в WordsGen(). Хотя, возможно, я в корне не...

Геометрический метод Монте-Карло(считает интеграл) не могу понять в чем ошибка
Геометрический метод Монте-Карло(считает интеграл) не могу понять в чем ошибка, вроде делаю все по...

Метод итерации и метод Ньютона (метод касательных)
Помогите решить методом итерации и методом Ньютона выражение привиденное ниже: e(в степени Х) -...

Mathcad. Локализировать корни уравнения f(x) = 0. Метод простой итерации и метод Ньютона.
Помогите пожалуста реализировать на маткаде следующий алгоритмы: 1) Локализировать корни...


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

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

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