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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 20:21   #1
efgen
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 10
По умолчанию 3 метода решения нелинейных уравнений Delphi

Всем привет, ребята! Прошу у Вас помощи с курсачем, ибо запутался.
Дано задание:
1. Разработать алгоритмы уточнения корней уравнения методами половин-ного деления, хорд, касательных и построить блок-схемы алгоритмов.
2. На языке программирования Pascal (или Delphi) создать программу для уточнения корней уравнения указанными методами, реализующую разра-ботанные алгоритмы. С помощью программы уточнить 3 любых корня уравнения с точностью .
3. Решить задачу средствами MathCad или Excel.
4. Построить график функции F(x,a) от x для параметра а, использовавшего-ся при отделении и уточнении корней.

Первое и третье задание выполнил сам, второе и четвертое попытался запилить по образцу из прошлогодних курсовых, но что-то не очень получилось.

Определил параметр а в MathCad и вычислил производную от функции:
http://freespace.by/download/68f0324a81
Вкинул функцию и её производную в Delphi, указав параметр а(равный 10, определили в Маткаде), и тут программа наругалась на меня: не понравилась строчка функции:
f:=a*sqrt(x)+sqrt(ln(a*x))+a*power( x,3)-a*power(x,1/10)-a;
возможно, дальше и производная не покатит, но пока тормознули на этом. Выкладываю на суд саму программу и текст программы. Жду ваших мыслей. Заранее спасибо.
Текст программы:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart, Math;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
RadioGroup1: TRadioGroup;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Chart1: TChart;
Button3: TButton;
Series1: TLineSeries;
function f(a,x:real):real;
function p(a,x:real):real;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a,x:extended;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;

end;

function TForm1.f(a,x:real):real;
begin
f:=a*sqrt(x)+sqrt(ln(a*x))+a*power( x,3)-a*power(x,1/10)-a;
end;

function TForm1.p(a,x:real):real;
begin
p:=3*a*power(x,2)+a/(2*sqrt(x))-a/(10*power(x,9/10)+1/(2*x*sqrt(ln(a*x))));
end;

procedure TForm1.Button1Click(Sender: TObject);
var M,c,x,x0,e,a:extended;
i:integer;
B:array [1..2,1..3]of extended;
begin

B[1,1]:=StrToFloat(Edit1.Text);
B[1,2]:=StrToFloat(Edit2.Text);
B[1,3]:=StrToFloat(Edit3.Text);
B[2,1]:=StrToFloat(Edit4.Text);
B[2,2]:=StrToFloat(Edit5.Text);
B[2,3]:=StrToFloat(Edit6.Text);
a:=StrToFloat(Edit7.Text);
e:=StrToFloat(Edit8.Text);

case RadioGroup1.ItemIndex of
0: begin
Memo1.Clear;
Memo1.Lines.Add(' Метод деления пополам');
for i:=1 to 3 do begin
repeat
x0:=(B[1,i]+B[2,i])/2;
if f(a,B[1,i])*f(a,x0)<0 then B[2,i]:=x0;
if f(a,B[1,i])*f(a,x0)>0 then B[1,i]:=x0;
until (B[2,i]-B[1,i])<=e;
Memo1.Lines.Add('Корень'+IntToStr(i )+' = '+FloatToStr(x0));
end;end;
1: begin

Memo1.Lines.Add(' Метод хорд');
for i:=1 to 3 do begin
c:=B[1,i];
x:=B[2,i];
M:=1;
repeat
x0:=x;
x:=(c*f(a,x0)-x0*f(a,c))/(f(a,x0)-f(a,c));
until (abs (f(a,x))/M)<=e;
Memo1.Lines.Add('Корень'+IntToStr(i )+' = '+FloatToStr(x));
end; end;
2: begin

Memo1.Lines.Add(' Метод касательных');
for i:=1 to 3 do begin
x:=B[1,i];
M:=1;
repeat
x0:=x;
x:=x0-(f(a,x0))/(p(a,x0));
until (abs (f(a,x))/M)<=e;
Memo1.Lines.Add('Корень'+IntToStr(i )+' = '+FloatToStr(x));
end; end;

end;

end;

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


procedure TForm1.Button3Click(Sender: TObject);
var x,b,y1,h:extended;
begin
Series1.Clear;
//a:=strtofloat(edit1.Text);
//b:=strtofloat(edit2.Text);
a:=0.1;
b:=1.5;
h:=0.01;
x:=a;
repeat
y1:=a*cos(abs(x))*cos(abs(x))*cos(a bs(x))+a*sin(a*x)+a*(sin(x)/cos(x))*(sin(x)/cos(x))*(sin(x)/cos(x))*(sin(x)/cos(x))+a*ln(x)*ln(x)+a+0.5;;
Series1.AddXY(x,y1,'',clTeeColor);
x:=x+h;
until x>b;
end;



end.

Программа:
http://freespace.by/download/03e7d30596
efgen вне форума Ответить с цитированием
Старый 07.05.2012, 21:05   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

http://www.machinelearning.ru/wiki/i...BC%D0%B8%D0%B8

вот тут всё есть) при наличии алгоритмов всё остальное уже вопрос техники)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 07.05.2012, 21:06   #3
efgen
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 10
По умолчанию

Спасибо, конечно, но у меня в программе прописаны три метода. Дело в том, что Делфи ругается на саму функцию. Не могу понять, в чем проблема.
efgen вне форума Ответить с цитированием
Старый 07.05.2012, 21:31   #4
efgen
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 10
По умолчанию

Прошу прощения, ссылка с решением в Маткаде неправильная. Вот верная:
http://freespace.by/download/977682afc8
efgen вне форума Ответить с цитированием
Старый 07.05.2012, 22:53   #5
efgen
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 10
По умолчанию

Если ввожу вместо своей функции простейшую f(x)=a*x+1, то решение находится. Когда ввожу свою функцию- пишет "is not a valid floating point value".
Где я накосячил, ребят?
efgen вне форума Ответить с цитированием
Старый 08.05.2012, 09:46   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Некоторые функции определены не на всей числовой оси, например аргумент логарифма или экспоненты должен быть положительным.
У Вас в программе отсутствует проверка этого условия. Начните с нее - дальше видно будет.
s-andriano вне форума Ответить с цитированием
Старый 08.05.2012, 16:03   #7
efgen
Пользователь
 
Регистрация: 20.02.2011
Сообщений: 10
По умолчанию

Рад бы, да я в этом деле, как свинья в апельинах, а к четвергу требуют курсач.
efgen вне форума Ответить с цитированием
Старый 11.04.2014, 20:43   #8
Puhan
Новичок
Джуниор
 
Регистрация: 12.02.2014
Сообщений: 1
По умолчанию

Ну что ты нашел тогда как исправить?
Puhan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать прикладное дополнение для решения нелинейных уравнений методом Ньютона или касательных на языке С++ kameliya Помощь студентам 0 08.11.2011 01:31
Решение нелинейных уравнений методом хорд на Delphi 6 или 7 Vovanella Помощь студентам 1 06.12.2010 22:36
Алгоритмы решения систем нелинейных уравнений Fataller Помощь студентам 2 18.08.2010 02:52
Программа для решения ситем нелинейных уравнений Appolinaria Помощь студентам 1 09.03.2009 18:53