Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
#1

Метод хорд для решения нелинейного уравнения

31.03.2012, 23:36. Просмотров 3835. Ответов 25
Метки нет (Все метки)

Проблема вылазит при нажатии на кнопку вычислить в строке, где опичывается функция f (64-ая строчка)... дело с ln... промежуток брал от 1 и дальше...не знаю как исправить...

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Math, Series;
 
type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Chart1: TChart;
    Series1: TLineSeries;
    Edit5: TEdit;
    TabSheet2: TTabSheet;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Label1: TLabel;
    Button3: TButton;
    Chart2: TChart;
    ListBox1: TListBox;
    Series2: TLineSeries;
    Edit10: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function f(x,a:extended):extended;
begin
f := a*power(cos(abs(x)),3)+a*sin(a*x)+a*power((sin(x)/cos(x)),4)+a*power(ln(abs(x)),2)+a;
end;
 
function pp(x,a:extended):extended;
begin
pp := power((-a),3)*sin(a*x);
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var j:extended;
var x,x0,e,c,x1,x2,a:extended;
begin
e:= strtofloat(Edit3.Text);
X1 := strtofloat(Edit1.Text);
x1:=max(x1,0);
X2 := strtofloat(Edit2.Text);
a := strtofloat(Edit5.Text);
x := x1;
c := x2;
if f(c,a)*pp(a,c)<0 then begin c := x1; x := x2 end;
repeat
  x0 := x;
  x := (c*f(a,x0)-x0*f(a,c))/(f(a,x0)-f(a,c));
until abs(f(x,a))/0.00001<=e;
j := x;
Memo1.Lines.Add('Корень для метода хорд: '+floattostrf(j,ffgeneral,5,3));
end;
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2012, 23:36
Ответы с готовыми решениями:

Решение нелинейного уравнения методом хорд
Помогите написать программу для решения нелинейного уравнения...

Найти корень нелинейного уравнения четыремя методами: половинного деления, касательных, хорд, итераций
Задание. Отделить корни уравнений F(x) = 0 и уточнить значения корней (или...

Найти корень нелинейного уравнения F(x)=0 методом хорд. Крайние значения предела ([a,b]) содержащий корень и погрешность (\epsilon ) вводятся с клавиа
Найти корень нелинейного уравнения F(x)=0 методом хорд. Крайние значения...

Решение нелинейного уравнения. Метод Ньютона
здравствуй, помогите пожалуйста найти ошибку в программе! необходимо найти...

Найти корень уравнения Метод Хорд
Задача, Найти корень уравнения sin(x)=0,5 методом хорд. Не могу понять как...

25
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 11:58 #2
Swex, тут много чего нету, когда проверял, некоторые функции пришлось дописывать, чтоб хоть скомпилировать. Да и еще и деление на 0 выскакивает. Мне нужно приближение e, интервал от a до b и само уравнение (функция pp - это что такое?).
1
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 14:07  [ТС] #3
Спасибо, что отозвались! Несколько процедур нажатия кнопок я забыл просто удалить. А так у меня всё компилируется... Вот фотка задания. я так понял что надо самому выбирать промежутки и приближения и, если что, сообщение об ошибке выводить! рр - это вторая производная от функции f.
http://www.fotohost.by/pic_b/12/04/1...cade7b49a6.jpg

Добавлено через 1 минуту
и модуль, как по мне, не нужен в уравнении...т.к. ln не может быть x<=0

Добавлено через 12 минут
http://www.fotohost.by/pic_b/12/04/1...9854b4635f.jpg
вот эта лучше картинка

Добавлено через 50 секунд
Это всё условие. Помощь нужна только в решении этим методом хорд
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 14:10 #4
Swex, по ссылке что-то не переходит. Лучше задание залить на форум. И еще: насколько я знаю, вторая производная в методе хорд не нужна, она используется в методе касательных.
1
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 14:12  [ТС] #5
я делал по методичке, там нужна была
0
Миниатюры
Метод хорд для решения нелинейного уравнения  
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 14:46 #6
Могу показать как 1 корень найти.
Кстати, я даже параметр не могу подобрать для этой функции, деление на 0 выходит постоянно.
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 14:48  [ТС] #7
Давайте, показывайте
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 14:49 #8
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
var a,a1,b,E: real;
    i: integer;
    t: boolean;
    c: array [0..300] of real;
 
function tg(x: real): real;
begin
 tg:=sin(x)/cos(x);
end;
 
function f(x,a: real): real;
begin
 try
  f:=a*cos(abs(x))*cos(abs(x))*cos(abs(x))+
  a*sin(a*x)+a*tg(x)*tg(x)*tg(x)*tg(x)+
  a*ln(x)*ln(x)+a;
 finally
 showmessage('Деление на 0!');
 end;
end;
begin
 a:=strtofloat(edit1.text);
 b:=strtofloat(edit2.text);
 e:=strtofloat(edit3.text);
 a1:=strtofloat(edit4.text);
 t:=true;
 i:=0;
 while t=true do
  begin
   c[i]:=a-((b-a)/(f(b,a1)-f(a,a1)))*f(a,a1);
   if abs(f(c[i],a1))>E then
    begin
     if f(a,a1)*f(c[i],a1)>0 then
      begin
       a:=c[i];
       inc(i);
       continue;
      end
       else
        begin
         b:=c[i];
         inc(i);
         continue;
        end;
    end
     else
      begin
       t:=false;
       break;
      end;
  end;
 label1.caption:='Корень: '+floattostrf(c[i],fffixed,5,3)+' Итераций: '+inttostr(i);
end;
Код 100% рабочий, проблема только в подборе значений.
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 14:53  [ТС] #9
а разве это метод хорд?
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 14:53 #10
А что, не похож?

Этот больше похож?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
uses crt;
var a,b,E,x1: real;
    i: integer;
    t: boolean;
    c: array [0..300] of real;
function f(x: real): real;
begin
 result:=x*x*x-2*x*x+cos(x);
end;
function f1(x: real): real;
begin
 result:=3*x*x-4*x-sin(x);
end;
function f2(x: real): real;
begin
 result:=6*x-4-cos(x);
end;
begin
 clrscr;
 write('a/b/e: ');
 readln(a,b,e);
 c[0]:=a;
 t:=true;
 i:=0;
 x1:=f1(c[i]);
 while t=true do
  begin
   c[i+1]:=c[i]-f(c[i])/f1(c[i]);
   if abs(f(c[i+1]))>E then
    begin
     inc(i);
     x1:=f2(c[i]);
     continue;
    end
     else
      begin
       writeln('C=',c[i+1]:4:2);
       t:=false;
       break;
      end;
  end;
 writeln('Iteratsiy: ',i);
 readln;
end.
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 15:05  [ТС] #11
Сильно от моего отличается. Спасибо. А какой промежуток вы нашли для корня уравнения?

Добавлено через 8 минут
А то у меня только ошибка вылазит и всё, про деление на 0 ошибка..

Добавлено через 1 минуту
Даже график как-то не так чертится у этой функции...
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 15:08 #12
Так вот и я о том же. Параметры уж больно трудно найти. График вроде чертится. При a=1 получается.
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 15:14  [ТС] #13
у меня он чертится, но на промежутке от 2 до 3, с шагом 0,0001 и е=0,0001 на графике появляется линия, которая при перемещении тоже двигается... x=4,7 примерно
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 15:39 #14
По сути интервал нужно выбирать исходя из того, в каком месте функция пересекается с осью абсцисс (?). Там и корень. Судя по графику, она нигде не пересекает ось.
При a=1:
0
Миниатюры
Метод хорд для решения нелинейного уравнения  
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 15:43  [ТС] #15
Это да, но у меня "пересекается". щас скрин покажу
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 15:46  [ТС] #16
при перемещении графика по оси Y длина меняется...
0
Миниатюры
Метод хорд для решения нелинейного уравнения   Метод хорд для решения нелинейного уравнения  
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 15:48 #17
Swex, через tchart в delphi строите? А Вы уверены насчет правильности построения? Я строил через онлайн построитель.
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 15:53  [ТС] #18
да, через Tchart...в правильности не уверен. нас только так учили. вот кусок программы по которому строится

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button2Click(Sender: TObject);
var X1,X2,x,h,f,tg,a:extended;
begin
X1 := strtofloat(Edit1.Text);
X2 := strtofloat(Edit2.Text);
h := strtofloat(Edit4.Text);
a := strtofloat(Edit5.Text);
x := x1;
while x<=X2 do
 begin
 tg:=sin(x)/cos(x);
  f := a*cos(abs(x))*cos(abs(x))*cos(abs(x))+a*sin(a*x)+a*tg*tg*tg*tg+a*ln(x)*ln(x)+a;
  series1.addXY(x,f);
   x := x+h;
end;
end;
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
01.04.2012, 15:59 #19
Вижу тангенс как переменную, не зависящую от x. И чему же он равен?
0
Swex
0 / 0 / 0
Регистрация: 19.03.2012
Сообщений: 15
01.04.2012, 16:03  [ТС] #20
ну sin c cos зависят же. Если писать tg(x) там ошибка... а как нужно?
0
01.04.2012, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 16:03

Найти корень нелинейного уравнения F(x)=0 методом касательных (метод Ньютона). Крайние значения предела ([a,b]) содержащий корень и погрешность (\epsi
Найти корень нелинейного уравнения F(x)=0 методом касательных (метод Ньютона)....

Метод хорд для дух функций (проверка)
Написал программу, вроде считает что-то, проверте правильная она . Заранее...

Метод хорд, метод касательных, метод половинного деления
Ребят помогите пожалуйста. Задали тему курсовой &quot;Решение нелинейных уравнений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru