Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задание по Делфи цикл

СКАчать Файл Ученик (159), на голосовании 1 год назад
Написать программу, которая выводит таблицу значений функции y(x) на фото, и ее разложение в ряд s(x) на фото для x, изменяющихся в интервале от Xn до Xk с шагом h. Функцию s(x) вычислить с точностью eps. Вывести число итераций необходимое для достижение заданной точности.
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:='-2';
Edit2.Text:='-0,1';
Edit3.Text:='0,25';
Edit4.Text:='0,001';
Memo1.Clear;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
xn,xk,x,h,e,a,s,y:Extended;
n:Integer;
begin
Memo1.Lines.Add('Вычисление таблицы значений функции');
Memo1.Lines.Add('Исходные данные:');
xn:=StrToFloat(Edit1.Text);
Memo1.Lines.Add('xn= '+FloatToStrF(xn,ffFixed,6,2));
xk:=StrToFloat(Edit2.Text);
Memo1.Lines.Add('xk= '+FloatToStrF(xk,ffFixed,6,2));
h:=StrToFloat(Edit3.Text);
Memo1.Lines.Add('h= '+FloatToStrF(h,ffFixed,8,3));
e:=StrToFloat(Edit4.Text);
Memo1.Lines.Add('eps= '+FloatToStrF(e,ffFixed,8,5));
Memo1.Lines.Add('Таблица знацений функции');
Memo1.Lines.Add('x S(x) Y(x) n');
x:=xn;
Repeat
a:=1;
S:=1;
n:=0;
While Abs(a)>e Do
Begin
Inc(n); //n:=n+1
a:=(exp(n*ln(-a)))*exp((2*n)*ln(1+x))/n;
s:=s+a;
end;
y:=Ln(1/(2+2*x+Sqr(x)));
Memo1.Lines.Add(FloatToStrF(x,ffFixed,6,2)+' '+FloatToStrF(s,ffFixed,8,4)+' '+FloatToStrF(y,ffFixed,8,4)+' '+IntToStr(n));
x:=x+h;
Until x>xk+h/2
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Memo1.Clear;
end;
Голосование за лучший ответ
Gennady Гений (60223) 1 год назад
Все это хорошо, а вопрос-то в чем? Но это так, для вступления. По-сути, программа работать не будет. Целиком не разбирался, но это точно не прокатит

(exp(n*ln(-a)))

Вы в курсе, что не существует логарифмов отрицательных чисел и даже нуля? А поскольку а=1, это как раз тот случай. Я понимаю, что вы хотели минус единицу возвести в некоторую степень. Только так это не делается! Все значительно проще. Достаточно каждый следующий член суммы умножать на -1 и все! И да, (2*n) здесь скобки не надо.
СКАчать ФайлУченик (159) 1 год назад
Скобки убрать и степени сделать power()
Что еще тут не так
Заранее спасибо
Gennady Гений (60223) СКАчать Файл, для возведения -1 в степень не обязательно использовать и Power(). Достаточно умножать каждое следующее слагаемое на -1. Примерно так a:=1; S:=0; Sign := -1; // знак перед первым слагаемым n:=0; While Abs(a) > e do begin Inc(n); //n:=n+1 a:= Sign * exp(2*n*ln(1+x))/n; s:=s+a; Sign := -Sign; // меняем знак для следующего слагаемого end; Только и здесь не все кучеряво. У вас начальное значение х = -2 и, следовательно, нельзя использовать возведение в степень, используя логарифм. Лучше отдельно вычислять числитель умножением предыдущего на (1+х)^2 а затем суммировать с учетом знака. While Abs(a) > е do begin Inc(n); a := a * Sqr(1+x); S := S + Sign * a / n; Sign := -Sign; end; Как-то так...
СКАчать ФайлУченик (159) 1 год назад
Спасибо, надеюсь получится
СКАчать ФайлУченик (159) 1 год назад
Числа не сходятся
и n скачет
И вопросик, что значит "инкрементация выполняется после накапливания суммы"
Gennady Гений (60223) СКАчать Файл, а какой функцией увеличивается значение переменной n? Правильно, Inc(n); Inc = инкремент Что касается не совпадающих чисел, значит где-то дрозданул. У меня примерно совпадают x S(x) Y(x) n -2,00 -0,6936 -0,6931 1000 -1,75 -0,4465 -0,4463 10 -1,50 -0,2230 -0,2231 5 -1,25 -0,0606 -0,0606 4 -1,00 0,0000 0,0000 2 -0,75 -0,0606 -0,0606 4 -0,50 -0,2230 -0,2231 5 -0,25 -0,4465 -0,4463 10 0,00 -0,6936 -0,6931 1000
СКАчать ФайлУченик (159) 1 год назад
Вроде все так сделал и все равно не так выводит
Gennady Гений (60223) СКАчать Файл, собственно, сам вывод Memo1.Lines.Add(Format('%8.2f %8.4f %8.4f %6.d', [x, s, y, n])); А это вывод шапки таблицы Memo1.Lines.Add(Format('%8s %12s %11s %9s', ['x', 'S(x)', 'Y(x)', 'n']));
Похожие вопросы