|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.05.2012, 20:21 | #1 |
Пользователь
Регистрация: 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 |
07.05.2012, 21:05 | #2 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
http://www.machinelearning.ru/wiki/i...BC%D0%B8%D0%B8
вот тут всё есть) при наличии алгоритмов всё остальное уже вопрос техники)
Правильно поставленная задача - три четверти решения.
|
07.05.2012, 21:06 | #3 |
Пользователь
Регистрация: 20.02.2011
Сообщений: 10
|
Спасибо, конечно, но у меня в программе прописаны три метода. Дело в том, что Делфи ругается на саму функцию. Не могу понять, в чем проблема.
|
07.05.2012, 21:31 | #4 |
Пользователь
Регистрация: 20.02.2011
Сообщений: 10
|
Прошу прощения, ссылка с решением в Маткаде неправильная. Вот верная:
http://freespace.by/download/977682afc8 |
07.05.2012, 22:53 | #5 |
Пользователь
Регистрация: 20.02.2011
Сообщений: 10
|
Если ввожу вместо своей функции простейшую f(x)=a*x+1, то решение находится. Когда ввожу свою функцию- пишет "is not a valid floating point value".
Где я накосячил, ребят? |
08.05.2012, 09:46 | #6 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Некоторые функции определены не на всей числовой оси, например аргумент логарифма или экспоненты должен быть положительным.
У Вас в программе отсутствует проверка этого условия. Начните с нее - дальше видно будет. |
08.05.2012, 16:03 | #7 |
Пользователь
Регистрация: 20.02.2011
Сообщений: 10
|
Рад бы, да я в этом деле, как свинья в апельинах, а к четвергу требуют курсач.
|
11.04.2014, 20:43 | #8 |
Новичок
Джуниор
Регистрация: 12.02.2014
Сообщений: 1
|
Ну что ты нашел тогда как исправить?
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработать прикладное дополнение для решения нелинейных уравнений методом Ньютона или касательных на языке С++ | 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 |