• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Как записать элемент суммы в цикле? формула внутри

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

Guest

Подскажите пожалуйста как мне записать элемент суммы в циклическом алгоритме
фото формулы прикрепил...
 

Вложения

  • __________.JPG
    __________.JPG
    11,4 КБ · Просмотры: 483
H

hosm

а в чем тут проблема-то?
примерно так =) только переменные опишите
Код:
sum = 0.0
k=1.0 ' тут будет (-1)^(n+1)
for n=1 to max ' max - количество итераций
sumN = k*(n + 1)*(n+2)*(n+3) * (x ^ n) ' эл-т суммы
k = - k; 
sum=sum+sumN
next
value = 1 - sum/6
 
G

Guest

Спасибо, вот только у меня в лабороторной цикл Do while и выглядит вот так


For i = 0 To n
x = a + i * h
ak = x
sum = x
k = 1
Do
ak = ak * ((x * (k + 4)) / ((-1) * (k + 1)))
sum = 1 - 1 / 6 * (sum + ak)
k = k + 1
Loop While Abs(ak) > eps

Исправьте пожалуйста
 
H

hosm

это непонятки ваще =) где Next? =)
For i = 0 To n
x = a + i * h
ak = x
sum = x
почему ak = x и sum = x?
при n = 0 (см. формулу на рисунке) получается a(0) = -6, формула дает s(0) = 1,
при n = 1 получается формула дает s(1) = 1 - (24х)/6 = 1 - 4x
т.е. у меня получается ak = 24х для n=1, если не учитывать 1/6 сразу.
Код:
ak = -6
sum = 1
k = 0 ' !!! мы a(n+1) выразили через а(n), a(0) = -6, в формуле s(0) = 1/6*6 = 1
Do
ak = - ak * x * (k + 4) / (k + 1) ' может, тут стоит поделить на 6, 
' но тогда в след. строке ak/6 заменить на ak
sum = sum + ak/ 6
k = k + 1
Loop While Abs(ak) > eps
 
G

Guest

Я подставил, все равно значения расходятся...
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Код"</div></div><div class="sp-body"><div class="sp-content">Private Sub mnuSpravka_Click()
MsgBox ", 10-АС, 29.12.10" _
& vbCrLf & "Лабораторная работа №7" _
& vbCrLf & "Вычисление бесконечной суммы" _
& vbCrLf & "Вариант 2"
End Sub

Private Sub pMnuClear_Click()
Cls
End Sub

Private Sub pMnuRezult_Click()
'объявляем переменные
'[a,b]- отрезок, п- число разбиений, h- шаг, eps- погрешность
Dim a As Single, b As Single, n As Integer, h As Single, eps As Single
'x- аргумент, y- функция
Dim x As Single, y As Single
'i,k- счетчики внешнего и вложенного циклов, ak- элемент суммы, sum- сумма
Dim i As Integer, k As Integer, ak, sum As Single
'открываем файлы для ввода и вывода данных
Open "E:\07\vyvodIn.txt" For Input As #1
Open "E:\07\vyvodOut.txt" For Output As #2
'ввод исходных данных
Input #1, a, b, n, eps
'шаг
h = (b - a) / n
'внешний цикл изменяет значения аргумента
For i = 0 To n
x = a + i * h
'начальные значения для суммирования ряда
ak = 6
sum = 1
k = 0 ' !!! мы a(n+1) выразили через а(n), a(0) = 6, в формуле s(0) = 1/6*6 = 1
Do
ak = -ak * (x * (k + 4) / (k + 1)) / 6 ' может, тут стоит поделить на 6,
' но тогда в след. строке ak/6 заменить на ak
sum = sum + 1 + ak / 6
k = k + 1
Loop While Abs(ak) > eps
'вычисление стандартной функции
If x = 0 Then y = 0.0039062 Else y = (1 / ((x + 4) ^ 4))
'вывод результатов на форму и в файл на диск
Print "x="; x, "функция у="; y, "сумма ="; sum, "просуммировано "; k; " элементов"
Print #2, "x="; x, "функция у="; y, "сумма ="; sum, "просуммировано "; k; " элементов"
Print
Next
End Sub

Private Sub pMnuStop_Click()
End
End Sub

вот посмотри пожалуйста, не пойму где ошибка...
в файле vyvodIn.txt значения такие : "0 0.9 10 0.0001"

спасибо заранее =)
 
H

hosm

найдите 3 отличия
ak = -ak * (x * (k + 4) / (k + 1)) / 6 ' может, тут стоит поделить на 6,
' но тогда в след. строке ak/6 заменить на ak
sum = sum + 1 + ak / 6
ak = - ak * x * (k + 4) / (k + 1) ' может, тут стоит поделить на 6, ' но тогда в след. строке ak/6 заменить на ak
sum = sum + ak/ 6

Добавлено: в вашем варианте надо просто
sum = sum + ak
 
G

Guest

эмм....а формула тогда какая будет?
 
H

hosm

Код:
	' вот убрала деление на 6 из цикла и вычисление s(0) сразу
x = 0
eps = 0.0001
'начальные значения для суммирования ряда
For i=1 To 10
ak = -6 ' тут был 1й баг =)
sum = 0
k = 0 ' !!! мы a(n+1) выразили через а(n), a(0) = 6
Do
ak = -ak * (x * (k + 4) / (k + 1))
sum = sum + ak
k = k + 1
If k Mod 100 = 0 Then Print "a(" & k & ") = " & ak ' тестовый принт
Loop While Abs(ak) > eps
Print "a(" & k & ") = " & ak ' тестовый принт - последнее значение
sum = 1 - sum/6
'вычисление стандартной функции
y = (1 / ((x + 1) ^ 4)) ' тут был 2й баг =)
Print "x="; x, "функция у="; y, "сумма ="; sum, "просуммировано "; k; " элементов"
x = x + 0.1
Next
 
G

Guest

Все написал, как вы написали... значения по прежнему разные... например при нуле функция = 0.003962 а сумма = 1 :rolleyes:
 
H

hosm

а что делать. математика она такая, сколько 0 на себя не перемножай... 0 даст. Что суммировать-то? =)
 
H

hosm

ржать долго будешь, наверно =)
нашла 2 ошибки
одну свою - в задании а(0) = -6
вторую - в формуле... для y =)
y = 1/((1 + x)^4) попробуй =)
квест пройден? =)
 
H

hosm

почему y = 1/((1 + x)^4) то? там же (x+4)^4 =)
вопрос не такой и не ко мне.
вопрос звучит так: почему там 1/((x+4)^4), если правильная формула получается при 1/((x+1)^4)?
вот ты это спроси у того, кто давал тебе условие с багом :) кто тебе там изначально писал код, решил более-менее правильно =)
 
G

Guest

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

hosm

а ты турок? рекуррентная формула вычисления чего? у тебя рекуррентная для члена суммы и есть [новое ak выражается через ранее вычисленное (ak = ak* что-то там...)], для всей суммы - нет, сумму последний мой вариант считает в конце (sum = 1 - sum/6). Итерационная формула приведена в моём первом сообщении (Сообщение #2)
Кажется, он придирается или ты просто не сам решал и не смог ему объяснить? подумай, в чем проблема. Я пока занята и расписывать получение рекуррентной формулы не могу...
 
G

Guest

Он придрался к
Код:
ak = ak * ((x * (k + 4)) / ((-1) * (k + 1)))
говорит неправильно и все...
 
H

hosm

у тебя формула вычислялась как а(к+1) через а(к), поэтому брала начальное к=0. Если что, либо сразу умножать на (-1/6), либо попробуй выразить а(к) через а(к-1). Если сам делал - сможешь...

Добавлено: Иначе говоришь, что у вас условие на рисунке неправильное было, сами посчитайте и проверьте задачу.
 
G

Guest

т.е.
Код:
ak = ak * (-1 * (k + 3) * x) / k
так???
он ошибку выдает...
 
H

hosm

и тогда в начале берем к=1, а не к=0. Формулу не проверяла, но очень похоже на правду.
-1 * можно просто заменить на - перед всем произведением (зачем лишняя операция умножения?)
ak = - ak * ((k + 3) * x) / k
 
G

Guest

OKEN, Спасибо большое, что помогала :(
Сдал я эту чертову лабу, оказалось там у них ошибка в методичке...
вместо
y = 1/((x + 4)^4)
y = 1/((x + 1)^4)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!