Форум: "Начинающим";
Текущий архив: 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