Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
3-1253089294
d@vinchi
2009-09-16 12:21
2011.02.20
DAO: как создать Memo поле с возможностью ввода пустых строк?


2-1290774813
Scott Storch
2010-11-26 15:33
2011.02.20
интерфейсы и осбождение памяти


2-1290672490
DeadAlice
2010-11-25 11:08
2011.02.20
Аналог функции sleep() без прерывания работы приложения


2-1291098239
George
2010-11-30 09:23
2011.02.20
ADOTable.Filter и float значения


15-1285092027
George
2010-09-21 22:00
2011.02.20
InnoSetup, Firebird Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский