• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Решение нелинейного уравнения методом деления отрезка пополам

  • Автор темы Автор темы Madara
  • Дата начала Дата начала

Madara

Новые
Регистрация
29 Ноя 2013
Сообщения
50
Реакции
0
Баллы
0
Решение нелинейного уравнения методом деления отрезка пополам

Здравствуйте.
Прошу у вас помощи в написании такой вот программы....: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:
 

Вложения

  • Screenshot-68(1).webp
    Screenshot-68(1).webp
    6.4 KB · Просмотры: 85
Ну если я правильно понял, то
EQ - это корень, root - сама функция ...
 
И почему мне всё чаще хочется взять составителей методичек за волосья и лупить лбом обо что-нибудь твёрдое до появления первой трещины?.. Это ж надо простой вопрос изложить столь напыщенно-высокопарно, что и впрямь ничего не понять!
Вообще-то нужно вот что:
1. Задать функцию отдельно в виде подпрограммы-функции.
2. Написать процедуру, которая будет решать задачу для данного Eps и выдавать результат, при этом, естественно, обращаясь к функции. И обозвать эту процедуру, если уж им так хочется, EQRoot.
3. Тело программы это, по сути, будет цикл по Eps, то есть для каждого из членов массива Eps Вы вызываете процедуру EQRoot, и результатом будет значение корня с возрастающей точностью.
 
Ну методички в универах всегда страдали "логичной последовательностью составления"
 
Ну методички в универах всегда страдали "логичной последовательностью составления"
offtopic.gif Часто ловлю себя на мысли - какое счастье, что меня никто программированию не учил и, соответственно, не стоял над душой с дебильными указулями типа "использовать/не использовать то-то", "задать в виде того-то", "описать так-то" и т.д. и т.п. и проч.! Потому что самое IMHO интересное в программировании - это именно творческое начало, ибо почти каждая программа - индивидуальна, каждый, даже начинающий, программист находит свои способы решения, стиль, приёмы - и это ужасно здорово. Увы, иногда возникает ощущение, что горе-преподаватели, в особенности составители методичек, просто задались целью выхолостить творческие подходы и привить студентам прямо таки ненависть к программированию. Извините - иногда трудно сдержаться.
 
И можете примерно описать как такие программы пишутся, вообще тьма.
В принципе - методом изучения программирования, чтения всяких книжек и пособий, а главное - проб и ошибок. В конце концов должно получиться что-то в таком роде:
Код:
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.
 
Спасибо большое.
Не понятно вообще было что требуется, я начал писать вообще по другому и запутался весь.
 
Может кому нибудь пригодится

Оказывается нужно было делать для 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:integer; f: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:=c; idx:=idx+1;
Until b-a<e;
R:=c;
end;

Var
idx1,idx2:integer;
Eps:Array[1..5] of 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],Res, idx1,f1);
Writeln('tochnost =',eps[i]);
Writeln(' f1=',Res:0:i);
writeln('interacii 1 =',idx1);
EQRoot(Eps[i],Res, idx2,f2);
Writeln(' f2=',Res:0:i);
writeln('interacii 2 =',idx2);
Writeln;
end;

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

Ещё раз большое спасибо!)
 
Назад
Сверху