Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите исправить код 
:(
    Опции темы
MrAlex
Дата 3.5.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Уважаемые программисты, помогите разобраться что не так.
Надо решить систему нелинейных уравнений методом простой итерации и методом Ньютона. Метод итерации вроде получился, а метод Ньютона никак не получается, что делать? Пишет, что "Invalid floating point operation"


Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
   // procedure FormCreate(Sender: TObject);
    procedure newton();
    procedure prost_iter();
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i:integer;

implementation

{$R *.dfm}

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

begin
x[0]:=1;
y[0]:=1;
for i:=1 to 100 do
begin
x[i]:=0.85+cos(y[i-1]);
y[i]:=1.32+sin(x[i-1]);
if ((x[i]-x[i-1])<0.1) and ((y[i]-y[i-1])<0.1) 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 real;

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

end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
//prost_iter();
newton();

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close();
end;

end.
 

Заранее благодарен!

Это сообщение отредактировал(а) MrAlex - 3.5.2010, 16:44
PM MAIL   Вверх
superVad
Дата 3.5.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Ерунда какая то.
f1[1]:=0.85+cos(y[i]);
f2[1]:=-1.32+sin(x[i-1]);
Как ты тут обращаешся к i а оно у тебя еще не инициализировано. Вот чему тут i равно?

for i:=2 to 100 do
begin
f1[i]:=0.85+cos(y[i]);
f2[i]:=-1.32+sin(x[i]);
Ты обращаешься к элементам массива (y[2] например) которые еще ничем не заполнены...

Да и отформатируй код - самому же легче будет.
PM MAIL   Вверх
MrAlex
Дата 3.5.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Вот так вот правильнее будет?

Код

begin
x[1]:=1.5;
y[1]:=0.5;
for i:=1 to 100 do
begin
f1[i]:=0.85+cos(y[i]);
f2[i]:=-1.32+sin(x[i]);
dx1[i]:=(f1[i]*(-1)*sin(y[i-1])-1*f2[i])/(cos(x[i-1])*sin(y[i-1]));
dx2[i]:=(cos(x[i-1])*f2[i]-f1[i]*2)/(cos(x[i-1])*sin(y[i-1]));
x[i]:=x[i-1]+dx1[i];
y[i]:=y[i-1]+dx2[i];


PM MAIL   Вверх
superVad
Дата 3.5.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



MrAlex, ну я же не знаю, чего ты хочешь
Но все равно не правильно. smile

может так....
Код

begin
  x[0]:=1.5;
  y[0]:=0.5;
  for i:=1 to 100 do
  begin
    f1[i]:=0.85+cos(y[i-1]);
    f2[i]:=-1.32+sin(x[i-1]);
    dx1[i]:=(f1[i]*(-1)*sin(y[i-1])-1*f2[i])/(cos(x[i-1])*sin(y[i-1]));
    ...


Да и вроде как значения f1, f2, dx1, dx2 ты дальше уже нигде не используешь. Т.е. это могут быть не массивы а просто переменные типа real.

Добавлено через 6 минут и 26 секунд
т.е.
Код

procedure TForm1.newton();
var
  i:integer;
  dx1, dx2, f1, f2: real;
  x,y:array[0..100] of real;
begin
  x[0]:=1.5;
  y[0]:=0.5;
  for i:=1 to 100 do
  begin
    f1:=0.85+cos(y[i-1]);
    f2:=-1.32+sin(x[i-1]);
    dx1:=(f1*(-1)*sin(y[i-1])-1*f2)/(cos(x[i-1])*sin(y[i-1]));
    dx2:=(cos(x[i-1])*f2-f1*2)/(cos(x[i-1])*sin(y[i-1]));
    x[i]:=x[i-1]+dx1;
    y[i]:=y[i-1]+dx2;
    if(abs(dx1)<0.1) and (abs(dx2)<0.1) then
    begin
      form1.StringGrid2.Cells[0,1]:=floattostr(x[i]);
      form1.StringGrid2.Cells[0,2]:=floattostr(y[i]);
    end;
  end;
end;

PM MAIL   Вверх
MrAlex
Дата 3.5.2010, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Спасибо! Ошибку больше не выдает, но и результат не выводит, почему?
PM MAIL   Вверх
superVad
Дата 3.5.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



Не получает ни одного результата удовлетворяющего условие:
if(abs(dx1)<0.1) and (abs(dx2)<0.1) then
PM MAIL   Вверх
MrAlex
Дата 3.5.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Что делать? Как исправить?
PM MAIL   Вверх
profesiachuvak
Дата 3.5.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: 1
Всего: 4



Цитата(MrAlex @  3.5.2010,  20:46 Найти цитируемый пост)
Что делать? Как исправить? 

Искать алгоритм методов, и искать ошибку в его реализации. Тут нужно теорию проверять.


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
MrAlex
Дата 4.5.2010, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 3.5.2010

Репутация: нет
Всего: нет



Ребята, ну кто в этом разберается помогите, пожалуйста
PM MAIL   Вверх
superVad
Дата 4.5.2010, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 7
Всего: 15



В чем - в этом? В решении системы нелинейных уравнений методом Ньютона?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.