Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2011, 10:49   #11
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Раз нужно найти корень с заданной точностью, то используй один из алгоритмов, которые предложил Вадим Мошев.
Лично от себя могу добавить, что существует еще алгоритм "золотого сечения". В теорию не вдаюсь, в инете полно информации по этому вопросу. Основная проблема при поиске решения уравнения- найти интервал, на котором имеется только один корень. Обычно используют метод Свенна (если нужно- гугл тебе в помощь).
Когда-то занимался оптимизацией, на Delphi писал программу для тестирования этого алгоритма. Вот что вышло:

код модуля:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function msb(x:real):real;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

function TForm1.msb(x:real):real;
begin
 msb:=power(x,2)-1;                                       //функция, корень которой ищется
end; 

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const t=0.618;
var delta1,delta2,s,x1,x2,n1,n2,deltaopt,nopt:real;
    i:integer;
begin
  label1.Caption:='';
  i:=1;

  delta1:=-4;                       //интервал (определен заранее) с одним корнем 
  delta2:=0;

  s:=delta2-delta1;                //начало "золотого сечения"
  x1:=delta2-t*s;
  x2:=delta1+t*s;
  n1:=msb(x1);
  n2:=msb(x2);

  repeat

  if n1<=n2 then
   begin
   delta2:=x2;
   x2:=x1;
   n2:=n1;
   s:=delta2-delta1;
   x1:=delta2-t*s;
   n1:=msb(x1);
   i:=i+1;
   end

  else
   begin
   delta1:=x1;
   x1:=x2;
   n1:=n2;
   s:=delta2-delta1;
   x2:=delta1+t*s;
   n2:=msb(x2);
   i:=i+1;
   end;

  until abs((n1-n2)/n2)<=0.0001;             //точность 0,0001

   deltaopt:=(delta2+delta1)/2;
   nopt:=msb(deltaopt);                          //конец "золотого сечения"

   label1.Caption:='i='+inttostr(i)+#13+                                             //вывод
                   'deltaopt= '+floattostrf(deltaopt,ffexponent,6,3)+#13+     //результатов
                   'nopt= '+floattostrf(nopt,ffexponent,6,3)+#13+
                   '%= '+floattostrf(abs((n1-n2)/n2),ffexponent,6,3);
end;

end.
Поясняю:
На Form1 есть label1 для вывода информации и Button1, при нажатии на которую запускается расчет. После его завершения видим результат:
i - количество произведенных итераций;
deltaopt - корень, найденный с заданной точностью;
nopt - значение функции в точке deltaopt;
% - погрешность вычисления корня.
С того времени использую этот алгоритм везде, где решаются алгебраические уравнения.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 25.03.2011, 19:18   #12
tapah4ik
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 20
По умолчанию

tsar_ все это конечно хорошо, но для студента 1го курса сложновато.70% того что здесь написано мы еще не проходили.
tapah4ik вне форума Ответить с цитированием
Старый 28.03.2011, 18:44   #13
tapah4ik
Пользователь
 
Регистрация: 16.03.2011
Сообщений: 20
По умолчанию

Нужно найти корень методом "половинного деления"
tapah4ik вне форума Ответить с цитированием
Старый 28.03.2011, 19:22   #14
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Алгоритм этого метода в книге "Оптимизация в технике", стр. 52. Качай ее здесь:
http://miem-stud.ru/index.php?option...rtdown&id=2120

P.S. Что в проге "золотого сечения" непонятного? Используются базовые компоненты Delphi, программа ничего сложнее умножения не делает... Если алгоритм непонятен, это другое дело, тут без его знания никуда (кстати, его описание в той же книге).
Программирую по необходимости

Последний раз редактировалось tsar_; 28.03.2011 в 19:32.
tsar_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интегралы Anubys Помощь студентам 0 08.03.2011 14:08
Криволинейные интегралы. TERAB1T Помощь студентам 1 24.08.2010 10:47
интегралы alexinspir Свободное общение 15 16.11.2009 18:04
Интегралы Golovastik Общие вопросы C/C++ 9 03.06.2009 21:11
Интегралы на с++ dimpa91 Помощь студентам 1 04.01.2009 14:16