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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2009, 21:59   #1
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию Delphi. Решение системы нелинейных уравнений методами Ньютона и простых итераций. Помогите найти ошибку!

В общем была задача: написать программу, которая бы решала заданную систему нелинейных уравнений двумя методами: простых итераций и методом Ньютона.

Программа в принципе готова, и написана вроде бы правильно, но всё таки есть ошибка. Метод простых итераций работает, всё считает и выводит. Ошибка в методе Ньютона - он не выводит результат в Стринг Грид. А если закомментить полностью метод простых итераций, и заставить считать только Метод Ньютона, то выводится ошибка "Invalid floating point operation"
Помогите пожалуйста найти ошибку!
Вот код:

Код:
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Image1: TImage;
    StringGrid1: TStringGrid;
    Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure newton();
procedure prost_iter();
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  var
Form1: TForm1;
i:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='x';
StringGrid1.Cells[1,0]:='y';
end;

procedure TForm1.prost_iter();
var
x,y:array[0..100] of real;

begin

x[0]:=1.5;
y[0]:=0.5;
for i:=1 to 100 do
begin
x[i]:=(sin(y[i-1]+2))-1.5;
y[i]:=0.5-cos(x[i]-2);
if ((x[i]-x[i-1])<0.01) and ((y[i]-y[i-1])<0.01) then
begin
form1.StringGrid1.Cells[0,1]:=floattostr(x[i]);
form1.StringGrid1.Cells[1,1]:=floattostr(y[i]);
end;
end;
end;

procedure TForm1.newton();
var
i:integer;
dx1, dx2:array[0..100] of real;
x,y:array[0..100] of real;
f1, f2:array[0..100] of double;

begin
x[0]:=1.5;
y[0]:=0.5;
for i:=1 to 100 do
begin
f1[i]:=sin(y[i]+2)-1.5;
f2[i]:=0.5-cos(x[i]-2);
dx1[i]:=(f1[i]*cos(y[i-1])-1*f2[i])/(-sin(x[i-1]-1)*cos(y[i-1])-1*2);
dx2[i]:=(-sin(x[i-1]-1)*f2[i]-f1[i]*2)/(-sin(x[i-1]-1)*cos(y[i-1])-1*2);
x[i]:=x[i-1]+dx1[i];
y[i]:=y[i-1]+dx2[i];
if(abs(dx1[i])<0.01) and (abs(dx2[i])<0.01) then
begin
form1.StringGrid1.Cells[0,2]:=floattostr(x[i]);
form1.StringGrid1.Cells[1,2]:=floattostr(y[i]);
end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
prost_iter();
newton();
end;
end.
Sianessa вне форума Ответить с цитированием
Старый 25.11.2009, 15:34   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Эх...
Если бы я знала паскаль, то постаралась бы помочь. А так могу только предположить, что проблема в объявлении переменных
Код:
dx1, dx2:array[0..100] of real;
f1, f2:array[0..100] of double;
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 25.11.2009, 17:16   #3
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Эхх... неужели мне совсем помочь некому? ((
Я уже три дня бьюсь и не могу ошибку найти!
Sweta, спасибо но чёто я не знаю уже, что и как поменять, чтобы работало... и это как бы Делфи, а не Паскаль...
Sianessa вне форума Ответить с цитированием
Старый 25.11.2009, 17:23   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Я понимаю что Делфи, но функции написаны языком похожим на паскаль.
Я не знаю как реагирует Делфи и паскаль на вычисления переменной типа
real, если в формуле используется переменная типа double. Поэтому и сделала такое предположение.
Да еще
Код:
for i:=1 to 100 do
begin
f1[i]:=sin(y[i]+2)-1.5;
f2[i]:=0.5-cos(x[i]-2);
При первом проходе y[i] и x[i] не определены. Кто-его знает что там в памяти.
Код:
x[0]:=1.5;
y[0]:=0.5;
Насколько я понимаю это элементы массива с нулевой индексацией. А в используемом языке это допустимо?
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 25.11.2009 в 17:36.
Sweta вне форума Ответить с цитированием
Старый 25.11.2009, 17:35   #5
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Sweta, эхх... я пыталась оба типа сделать real, но это не помогло ((
Вроде допустимо, насколько я знаю...

Последний раз редактировалось Sianessa; 25.11.2009 в 17:38.
Sianessa вне форума Ответить с цитированием
Старый 25.11.2009, 17:58   #6
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Так как идей у нас нет, ввиду моего незнания предлагаю попробовать следующее:
Код:
x[1]:=1.5;
y[1]:=0.5;
for i:=2 to 100 do
begin
может сдвинемся с мертвой точки.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 25.11.2009, 18:04   #7
Sianessa
Форумчанин
 
Регистрация: 18.01.2009
Сообщений: 144
По умолчанию

Sweta, увы, но ничего к сожалению не изменилось...
Мне кажется, что дело всё таки в типах объявленных данных... Просто я не могу найти ошибку, и перепробовала уже много чего...
Sianessa вне форума Ответить с цитированием
Старый 26.11.2009, 12:12   #8
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

1. Все таки элементы массивов начинаются с х[1], т.е. программа не поймет
х[i-1] при i=1.
2. Во всех массивах записано неизвестно что, т.е. при вычислении
Код:
f1[i]:=sin(y[i]+2)-1.5;
f2[i]:=0.5-cos(x[i]-2);
, значение y[i] и x[i] -значение никем не определено.
Цитата:
"Invalid floating point operation"
Посмотрите в Help Delphi функцию abs и ее возвращаемое значение.
(Для С++ к примеру это целое, опять же для С++ для double д.б функция fabsl, может у Вас тоже.)
Поставте точку останова на условии сравнения, вызовите на экран локальные переменные и пройдитесь по шагам. Посмотрите что делается с Вашими y[i] и x[i].
Кстати переписала Вашу программу на С++. Если массивы ничем не заполнять, то в ячейки выводиться NAN. Если заполнить нулями y[i] и x[i] расходятся и за все 100 циклов вдвоем не бывают меньше 0.01
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 26.11.2009 в 12:22.
Sweta вне форума Ответить с цитированием
Старый 13.04.2012, 17:32   #9
popondopulus_1
Новичок
Джуниор
 
Регистрация: 26.02.2012
Сообщений: 2
По умолчанию

привет!!! наткнулся на твой пост. мне нужно написать программу для системы нелинейных уравнении над полем классов вычетов. ты давно это делал, может осталось че нидь???
popondopulus_1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить систему линейных уравнений методом простых итераций на Delphi Кнопик Помощь студентам 2 22.10.2009 16:11
Решение нелинейных уравнений матодом Ньютона Гудвин Помощь студентам 1 09.10.2009 12:02
Системы нелинейных уравнений Anarki Общие вопросы C/C++ 1 26.09.2009 23:49
Метод простых итерации для нелинейных уравнений. Подскажите где ошибка DuHbka Помощь студентам 15 31.05.2009 22:46