Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.20;
Скачать: CL | DM;

Вниз

Подсчет суммы ряда   Найти похожие ветки 

 
elluminate ©   (2010-11-28 21:43) [0]

необходимо посчитать и сравнить со значением функции визуально. х меняется от 0.1до 0.8.прибавляю 0.03 ибо кол-во расчетных точек должно не менее 10быть. написал код,но х при окончании больше 0.8 получается. вот код

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Edit3: TEdit;
   Button1: TButton;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 eps,j,a,x,s:real;
 n:integer;

implementation

{$R *.dfm}
function c(n:integer):real;
begin
result:=((sqr(n+1)+1)*x)/(2*((sqr(n))+1));
end;
function f(x:real):real;
 begin
result:=(exp(x/2)*ln((sqr(x)/4)+(x/2)+1));
 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
x:=strtofloat(edit2.Text);
a:=strtofloat(edit1.text);
eps:=strtofloat(edit3.Text);
s:=0;
n:=1;

while x<=0.8 do begin
repeat
s:=s+a;
a:=a*c(n);
inc(n);
x:=x+0.03;
until (s-f(x))<=eps;
end;

edit4.Text:=floattostr(x);
edit5.text:=floattostr(f(x));
edit6.Text:=floattostr(s);
end;

end.


 
Сергей М. ©   (2010-11-28 22:08) [1]


> х при окончании больше 0.8 получается


И что ?


 
elluminate ©   (2010-11-28 22:37) [2]

по тз 0.1<=х<=0.8


 
Юрий Зотов ©   (2010-11-28 23:21) [3]

Так и должно быть. Математика ЭВМ немного отличается от обычной:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
Германн ©   (2010-11-29 00:02) [4]


> но х при окончании больше 0.8 получается

Цикл while надо заменить на repeat


 
Anatoly Podgoretsky ©   (2010-11-29 00:31) [5]


> while x<=0.8 do begin

Так условие выхода если больше или равен.
Если равен почти невероятно выполнить, вот и выходит если больше. Если ты хочешь минимум ошибки, то условие надо заменить на сравнение с эпсилоном, который надо еще выбрать.


 
Германн ©   (2010-11-29 01:39) [6]

"Бредовый" алгоритм :(

while x<=0.8 do begin
 repeat
   s:=s+a;
   a:=a*c(n);
   inc(n);
   x:=x+0.03;
 until (s-f(x))<=eps;
end;

(Форматировал код сам. Не поленился, в отличие от автора).

В любом случае присваивание x:=x+0.03; нужно из внутреннего цикла перенести во внешний.
+[4] (возможны вариации в зависимости от ТЗ)
+[5] вдобавок к [4] с учетом данного сообщения.


 
Anatoly Podgoretsky ©   (2010-11-29 09:13) [7]

Это почему же, ведь x используется во внутреннем цикле until (s-f(x))<=eps


 
12 ©   (2010-11-29 09:57) [8]

не про этот случай, а вообще
в подобных вещах, когда учился, строил графики "навстречу"
X менялся от min к max, и навстречу, от max к min
т.е. график строился от начала и от конца диапазона одновременно

Потому что
1. Не читал http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374,
т.к. не было тогда она написана, а опыта не было.
2. Часто именно точки на границе интересуют, а так - точно их "не пролетим"


 
Jeer ©   (2010-11-29 10:53) [9]


>  х меняется от 0.1до 0.8.прибавляю 0.03


В первом приближении достаточно задавать начальное значение x как
0.8 - k * 0.03;
Тогда с большой вероятностью получим 0.8, хотя это и не панацея.

Если известно начальное Xa, конечное Xb>Xa и шаг Xstep, то лучше перейти к целочисленной арифметике
Imax := Round(Int((Xb-Xa)/Xstep))

И далее двигаемся циклом
for i:=1 to Imax
..
x := i*Xstep;


 
Jeer ©   (2010-11-29 16:25) [10]

P.S.
Понятно, что
x := Xa + i*Xstep;
и плюс в том, что не накапливается ошибка сложения.

P.P.S.
Конечное значение диапазона может быть обработано исключительно.


 
elluminate ©   (2010-11-29 17:14) [11]

jeer,если сделать как ты говоришь значение функции с суммой ряда не совпадает


 
elluminate ©   (2010-11-29 17:15) [12]

сумма вообще отрицательная


 
elluminate ©   (2010-11-29 17:16) [13]

сумма вообще отрицательная


 
Jeer ©   (2010-11-29 18:28) [14]


> elluminate ©   (29.11.10 17:14) [11]
>
> jeer,если сделать как ты говоришь значение функции с суммой
> ряда не совпадает


Главное, чтобы ум с разумом совпал :)
Вот тогда все и получится.

Берем твой пример.
Xa = 0.1 ( принимаем )
Xb = 0.8 ( условие )
Xstep = 0.03 ( условие )

Тогда Imax = 23

Пишем цикл
for i := 0 to Imax do begin
..
 x := Xa + i * Xstep;
..
end;

В итоге x "пробегает" от Xa до (Xb - Xstep), т.е. от 0.1 до 0.79

Что тут еще непонятного ?


 
elluminate ©   (2010-11-29 18:32) [15]

все так и делал))не тупой я.наверно.скомпилируй.и запусти,посмотри выходные данные


 
elluminate ©   (2010-11-29 18:56) [16]

вот.посмотри что я не так делаю
function c(n:integer):real;
begin
result:=(sqr(n+1)+1)*x/2*(sqr(n)+1);
end;

function f(x:real):real;
    begin
  result:=exp((x/2)*ln((sqr(x)/4)+(x/2)+1));
    end;

procedure TForm1.Button1Click(Sender: TObject);
  begin
a:=strtofloat(edit1.text);
eps:=strtofloat(edit6.text);
s:=0;
n:=1;
x1:=0.1;
x2:=0.8;
xs:=0.05;
im:=round(int((x2-x1)/xs));
for i:=0 to im do begin
repeat
s:=s+a;
a:=a*c(n);
x:=x1+i*xs;
inc(n);
until c(n)<eps;
end;
edit3.text:=floattostr(x);
edit4.text:=floattostr(f(x));
edit5.text:=floattostr(s);
end;

end.


 
Leonid Troyanovsky ©   (2010-11-29 21:50) [17]


> elluminate ©   (29.11.10 18:56) [16]

> вот.посмотри что я не так делаю

Да, считай, все не так.

--
Regards, LVT.


 
elluminate ©   (2010-11-29 22:11) [18]

такие ответы можно и не писать..))


 
Leonid Troyanovsky ©   (2010-11-29 22:20) [19]


> elluminate ©   (29.11.10 22:11) [18]

> такие ответы можно и не писать..))

Такой код приводить - тоже не можно.

Код д.б. необходим и достаточен для того, чтобы могущий
воспомоществовать не терял своего неоценимого времени
на поиски всех  многочисленных a, eps, s.., но простым
нажатием клавиши подверг его суровому испытанию.

--
Regards, LVT.


 
elluminate ©   (2010-11-29 22:24) [20]

а=1,eps=0,0001


 
Leonid Troyanovsky ©   (2010-11-29 22:29) [21]


> elluminate ©   (29.11.10 22:24) [20]

Тема нажатия клавиши не раскрыта.

А ты нас уважаешь?
Я, вот, например, мог б и правила послать читать, или,
скажем, http://rsdn.ru/Info/Howtoask.xml

--
Regards, LVT.


 
elluminate ©   (2010-11-29 22:33) [22]

что конкретно тебя не устраивает?если бы ты говорил прямо,а не ходил вокруг да около,то времени ушло бы меньше)))


 
Leonid Troyanovsky ©   (2010-11-29 22:37) [23]


> elluminate ©   (29.11.10 22:33) [22]

> что конкретно тебя не устраивает?если бы ты говорил прямо,
> а не ходил вокруг да около,то времени ушло бы меньше)))

Мы никуда не торопимся.
Нас все устраивает.

--
Regards, LVT.


 
elluminate ©   (2010-11-29 22:39) [24]

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


 
Leonid Troyanovsky ©   (2010-11-29 22:46) [25]


> elluminate ©   (29.11.10 22:39) [24]

> противоречишь сам себе))твое неоценимое время уходит на
> пустые разговоры.

У данного ресурса тоже есть уровень толерантности.
Удалят ветку - и напрасны были все усилия.

Я и не заявлял, что свое неоценимое время готов тратить на
воспомоществование, если оному, к тому же,
всячески воспрепятствуют.

--
Regards, LVT.


 
Юрий Зотов ©   (2010-11-30 00:20) [26]

> elluminate ©

Попробуйте взять диапазон от 0.125 до 0.75 и шаг 0.0625. Это точно удовлетворяет условиям задачи (0.1<=х<=0.8 и не менее 10 шагов).



Страницы: 1 вся ветка

Текущий архив: 2011.02.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
2-1290778489
integer
2010-11-26 16:34
2011.02.20
Как сделать индикатор звука


15-1289037132
faustpatron13
2010-11-06 12:52
2011.02.20
Разрешение


2-1290457059
Дима
2010-11-22 23:17
2011.02.20
Связать две проги


15-1289424592
Юрий
2010-11-11 00:29
2011.02.20
С днем рождения ! 11 ноября 2010 четверг


2-1290762980
axels
2010-11-26 12:16
2011.02.20
gecko browser