Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Решение нелинейного уравнения методом деления отрезка пополам (http://www.tehnari.ru/f41/t95673/)

Madara 07.04.2014 22:13

Решение нелинейного уравнения методом деления отрезка пополам
 
Вложений: 1
Здравствуйте.
Прошу у вас помощи в написании такой вот программы....:tehnari_ru_837:
И можете примерно описать как такие программы пишутся, вообще тьма.

ФУНКЦИЯ – КАК ПАРАМЕТР ПРОЦЕДУРЫ EQROOT.
Составить программу для решения уравнения f1(х) = 0 и f2(х) = 0 на отрезке [А,В] с точностью Еps методом деления отрезка пополам.
Задача заключается в том, чтобы вычисление индивидуальной формулы F(x) было оформлено в виде функции. При этом сама функция должна быть использована как параметр процедуры EqRoot. Обращение вида F(x) внутри процедуры должно выдать результат вычисления формулы в точке x, подобно тому, как обычно используются стандартные функции типа sin(x), Ln(x). Процедура не должна использовать «внутри себя» глобальных переменных.

Для проверки программы задать:
А = 0 0, В = 2,
массив Еps[1..5]=(0.1,0.01,0.001, 0.0001, 0.00001),
F_16 и F_17

Задача на картинке.

Совершенно не понятно что такое EqRoot...
Возможно это и не трудно, но я даже не знаю с чего начать.
Прошу прощения за свою глупость:tehnari_ru_138:

Gruvi 07.04.2014 22:19

Ну если я правильно понял, то
EQ - это корень, root - сама функция ...

Vladimir_S 07.04.2014 22:32

И почему мне всё чаще хочется взять составителей методичек за волосья и лупить лбом обо что-нибудь твёрдое до появления первой трещины?.. Это ж надо простой вопрос изложить столь напыщенно-высокопарно, что и впрямь ничего не понять!
Вообще-то нужно вот что:
1. Задать функцию отдельно в виде подпрограммы-функции.
2. Написать процедуру, которая будет решать задачу для данного Eps[i] и выдавать результат, при этом, естественно, обращаясь к функции. И обозвать эту процедуру, если уж им так хочется, EQRoot.
3. Тело программы это, по сути, будет цикл по Eps, то есть для каждого из членов массива Eps Вы вызываете процедуру EQRoot, и результатом будет значение корня с возрастающей точностью.

Gruvi 07.04.2014 22:57

Ну методички в универах всегда страдали "логичной последовательностью составления"

Vladimir_S 08.04.2014 09:40

Вложений: 1
Цитата:

Сообщение от Gruvi (Сообщение 1023071)
Ну методички в универах всегда страдали "логичной последовательностью составления"

Вложение 182266 Часто ловлю себя на мысли - какое счастье, что меня никто программированию не учил и, соответственно, не стоял над душой с дебильными указулями типа "использовать/не использовать то-то", "задать в виде того-то", "описать так-то" и т.д. и т.п. и проч.! Потому что самое IMHO интересное в программировании - это именно творческое начало, ибо почти каждая программа - индивидуальна, каждый, даже начинающий, программист находит свои способы решения, стиль, приёмы - и это ужасно здорово. Увы, иногда возникает ощущение, что горе-преподаватели, в особенности составители методичек, просто задались целью выхолостить творческие подходы и привить студентам прямо таки ненависть к программированию. Извините - иногда трудно сдержаться.

Vladimir_S 08.04.2014 11:22

Цитата:

Сообщение от Madara (Сообщение 1023049)
И можете примерно описать как такие программы пишутся, вообще тьма.

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

Var
 Eps:Array[1..5] of Real;
 i:Integer;
 Res:Real;

Function F(x:real):real;
begin
 F:=Sqr(Sin(x)+Cos(x))/Exp(Ln(33.5)*2/3)+Sqrt(3/7)-x;
end;

Procedure EQRoot(e:real; var R:Real);
var
 a,b,c:real;
begin
 a:=0.0;
 b:=2.0;
 Repeat
  c:=(a+b)/2;
  if F(a)*F(c)<0 then b:=c else a:=c;
 Until b-a<e;
 R:=c;
end;

Begin
 Eps[1]:=0.1;
 for i:=2 to 5 do Eps[i]:=Eps[i-1]/10;
 for i:=1 to 5 do
  begin
  EQRoot(Eps[i],Res);
  Writeln(Res:12:10);
  end;
 Readln
End.


Madara 10.04.2014 23:30

Спасибо большое.
Не понятно вообще было что требуется, я начал писать вообще по другому и запутался весь.

Madara 13.04.2014 15:53

Может кому нибудь пригодится

Оказывается нужно было делать для 2 функций, с выводом количества интераций, с выводом функции от определённого аргумента, у меня F(0.83)...

Переписывал программу на паре в Делфи, не знаю правильно или нет, но препод принял, обозначив ошибку:
PHP код:

a:=0.8;
b:=1.5

"Эти переменные необходимо вводить вне процедуры"


PHP код:

type
TF1
=function(r:real):real;

Function 
F1(x:real):real;
begin
 F1
:=Sqr(Sin(x)+Cos(x))/Exp(Ln(33.5)*2/3)+Sqrt(3/7)-x;
end;
Function 
F2(x:real):real;
begin
 F2
:=Sqrt(ln(7.9)+(exp(-x))-((ln(x)*2)/11))-x;
end;

Procedure EQRoot(e:real; var R:Real; var Idx:integerf:TF1);
var
a,b,c:real;
begin
a
:=0.8;
b:=1.5;
idx:=0;
Repeat
c
:=(a+b)/2;
if 
F(a)*F(c)<0 then b:=c
else a:=cidx:=idx+1;
Until b-a<e;
R:=c;
end;

Var
idx1,idx2:integer;
Eps:Array[1..5of Real;
i:Integer;
Res:Real;
Begin
Eps
[1]:=0.1;
for 
i:=2 to 5 do Eps[i]:=Eps[i-1]/10;
for 
i:=1 to 5 do
begin
EQRoot
(Eps[i],Residx1,f1);
Writeln('tochnost =',eps[i]);
Writeln(' f1=',Res:0:i);
writeln('interacii 1 =',idx1);
EQRoot(Eps[i],Residx2,f2);
Writeln(' f2=',Res:0:i);
writeln('interacii 2 =',idx2);
Writeln;
end;

writeln(F1(0.83):0:4);
Readln;
End

Ещё раз большое спасибо!)


Часовой пояс GMT +4, время: 21:06.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.