Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

численные методы. модифицированный метод Ньютона

9.5K
04 декабря 2007 года
leahov
54 / / 09.12.2005
имеется код решения нелинейного уравнения методом Ньютона (он же метод касательных)

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<math.h>

#include "urav.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
float f(float x)
{
//    return x*x*x + 3*x - 2;
 return x*x*x + x - 5;
}
float fdx(float x)
{//    return 3*x*x +3;
  return 3*x*x +1;
}
float fd2x(float x)
{
    return 4*x;
}
float absolute(float x)
{    return x < 0 ? -x : x;
}
void __fastcall TForm1::kasat(float a, float b, float eps)
{
 if(f(a)*f(b) < 0)
 {
  ShowMessage("Касательные: a и b неправильные");
  return;
 }
 float x0 = a;
 if(f(a)*fd2x(a) < 0)
 {
  x0 = b;
 }
 int step = 1;
 float x1 = x0 - f(x0)/fdx(x0);
 while(absolute(x1-x0) > eps)
 {
  x0 = x1;
  x1 = x0 - f(x0)/fdx(x0);
  step = step + 1;
 }
 Label17->Caption = x1;
 Label18->Caption = f(x1);
 Label25->Caption = step;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   float a, b, eps;
 //  ShowMessage("Vvedite a, b, epsilon: ");
   a = StrToFloat(Edit1->Text);
   b = StrToFloat(Edit2->Text);
   eps = StrToFloat(Edit3->Text);
   kasat(a, b, eps);

}
//---------------------------------------------------------------------------


как сделать из него модифицированный метод Ньютона, если кто знает подскажите

P.S. суть методов такова, метод ньютона (он же метод касательных) это Метод основан на замене функции f(x) на каждом шаге итерационного процесса поиска касательной, пересечение которой с осью абсцисс дает приближение корня. его формула Xn+1 = X n - (f (Xn / f ' (Xn), модифицированный метод ньютона это Этот метод заключается в том, что вместо вычисления производной на каждом шаге поиска находится ее приближенное значение с помощью конечных разностей и формула его Xn+1 = X n - (f (Xn / f ' (X0) )
Короче в формуле f` вместо (xn) становится (x0)
386
04 декабря 2007 года
newcss
297 / / 05.04.2005
http://power.tpu.ru/ates/ates/courses/vt/lab-vt-1.htm

ВОт тут почитай про модифицированный метод Ньютона. Там вполне доступно расписан алгоритм.
9.5K
05 декабря 2007 года
leahov
54 / / 09.12.2005
newcss там я был и как раз оттуда я взял алгоритм для обычного медота Ньютона, но я не могу понять как из него сделать модифицированный, в программировании я ещё новичок поэтому сложно ещё реализовывать такие модификации
1
05 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: leahov
newcss там я был и как раз оттуда я взял алгоритм для обычного медота Ньютона, но я не могу понять как из него сделать модифицированный, в программировании я ещё новичок поэтому сложно ещё реализовывать такие модификации


Уважаемый - вы случайно разделом не ошиблись? Здесь мало выложить найденный в сети код и надеятся что вам его переделают - подобные трюки здесь наказываются.
У вас есть пример как реализуется алгоритм по методу касательных. Код кстати, весьма неплохо читаем. Есть формула для модифицированного метода. Все что вам необходимо сделать - включить думалку и внести изменения. Если в связи с этим у вас появятся конкретные вопросы по проделанной вами работе - тогда их задавайте.

9.5K
05 декабря 2007 года
leahov
54 / / 09.12.2005
Уважаемый kot_ , код не найдет в сети, и я не прошу написать мне код заново, просто хочу узнать реализацию алгоритма, потому что мне кажется что в отличии от метода касательных здесь нужно вводить ещё одну переменную которая будет является константой, или нет?
1
05 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: leahov
Уважаемый kot_ , код не найдет в сети, и я не прошу написать мне код заново, просто хочу узнать реализацию алгоритма, потому что мне кажется что в отличии от метода касательных здесь нужно вводить ещё одну переменную которая будет является константой, или нет?


Да, нужно ввести еще одну локальную переменную - в принципе она может быть и константой - для того, что бы избежать случайного модифицирования.

9.5K
05 декабря 2007 года
leahov
54 / / 09.12.2005
пока обед на работе вернулся к ньютону. ввел переменную z, попробывал сделать её константой

Код:
void __fastcall TForm1::modinewton(float a, float b, float eps, int z)
{
 if(f(a)*f(b) < 0)
 {
  ShowMessage("modinewton: a и b неправильные");
  return;
 }
 float x0 = a;

 if(f(a)*fd2x(a) < 0)
 {
  x0 = b;
 }
 z = const;
 fd2x = z;
 int step = 1;
 float x1 = x0 - f(x0)/z;
 while(absolute(x1-x0) > eps)
 {
  x0 = x1;
  x1 = x0 - f(x0)/fdx(x0);
  step = step + 1;
 }
 Label36->Caption = x1;
 Label37->Caption = f(x1);
 Label38->Caption = step;
}


вылезли ошибки:
[C++ Error] urav.cpp(160): E2188 Expression syntax
[C++ Error] urav.cpp(161): E2277 Lvalue required

Lvalue required - это как я понял из хелпа константа не может быть слева, но если меняю местами expression syntax остается по прежнему и выходит другая ошибка [C++ Error] urav.cpp(161): E2034 Cannot convert 'float (*)(float)' to 'int'

что я делаю не правильно?
11
05 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
z = const;
const - зарезервированное слово (обычно они жирным шрифтом выделяются
9.5K
05 декабря 2007 года
leahov
54 / / 09.12.2005
секундочку модифицированный метод ньютона и Метод Ньютона с аппроксимацией производной это одно и тоже? если да то получается константа не нужна уже,а просто вводим переменную h и получаем
 
Код:
...
  float x1 = fx*h/(f(x+h)-fx)
...


где h = b ? так получается?
1
05 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: leahov
пока обед на работе вернулся к ньютону. ввел переменную z, попробывал сделать её константой

Код:
void __fastcall TForm1::modinewton(float a, float b, float eps, int z)
{
 if(f(a)*f(b) < 0)
 {
  ShowMessage("modinewton: a и b неправильные");
  return;
 }
 float x0 = a;

 if(f(a)*fd2x(a) < 0)
 {
  x0 = b;
 }
 z = const;
 fd2x = z;
 int step = 1;
 float x1 = x0 - f(x0)/z;
 while(absolute(x1-x0) > eps)
 {
  x0 = x1;
  x1 = x0 - f(x0)/fdx(x0);
  step = step + 1;
 }
 Label36->Caption = x1;
 Label37->Caption = f(x1);
 Label38->Caption = step;
}


вылезли ошибки:
[C++ Error] urav.cpp(160): E2188 Expression syntax
[C++ Error] urav.cpp(161): E2277 Lvalue required

Lvalue required - это как я понял из хелпа константа не может быть слева, но если меняю местами expression syntax остается по прежнему и выходит другая ошибка [C++ Error] urav.cpp(161): E2034 Cannot convert 'float (*)(float)' to 'int'

что я делаю не правильно?



Ну во-первых, не правильно объявляется переменная. Рекомендую ознакомиться с первыми страницами любого справочного пособия по С++(по билдеру тоже сойдет).
То как делаете это вы, правильно будет так

 
Код:
void __fastcall TForm1::modinewton(float a, float b, float eps, const int z)

Второе. Не вдаваясь в правильность собственно решения - хз занят другим и вспоминать математику некогда НО зачем константное z? Фактически это должно выглядеть вот так:
 
Код:
const float xc = fdx(x0);
 while(absolute(x1-x0) > eps)
 {
  x0 = x1;
  x1 = x0 - f(x0)/xc;
  step++;
 }
9.5K
05 декабря 2007 года
leahov
54 / / 09.12.2005
kot_ в общем я понял примерно мысль, спасибо за помощь, иду домой и дома в спокойной обстановке добью этот вопрос
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог