Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Информатика


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Специалист
Рейтинг: 3431
∙ повысить рейтинг »
lamed
Статус: Бакалавр
Рейтинг: 2458
∙ повысить рейтинг »
_Ayl_
Статус: Практикант
Рейтинг: 1841
∙ повысить рейтинг »

/ НАУКА И ОБРАЗОВАНИЕ / Точные и естественные науки / Информатика

Номер выпуска:187
Дата выхода:07.05.2010, 20:30
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:161 / 142
Вопросов / ответов:1 / 1

Вопрос № 178167: Здравствуйте, уважаемые эксперты! Мне надо написать программу в qbasic, высчитать интеграл тремя способами Вот что у меня получилось: a0=3.056565 a1=-0.0227886 a2=-1.080304E-2 INPUT "Nijnyaya granica integrala:"; a INPU...



Вопрос № 178167:

Здравствуйте, уважаемые эксперты!
Мне надо написать программу в qbasic, высчитать интеграл тремя способами
Вот что у меня получилось:
a0=3.056565
a1=-0.0227886
a2=-1.080304E-2
INPUT "Nijnyaya granica integrala:"; a
INPUT "Verhnyaya granica integrala:"; b
INPUT "Tochnost vichisleniya:"; E
INPUT "Kollichestvo intervalov:"; n1
'Formula srednih pryamougolnikov
n = 1
h = (b - a)
sp = h * (a2 * ((a + b) / 2) ^ 2 + a1 * ((a + b) / 2) + a0)
DO
n = 2 * n
h = (b - a) / n
s1 = sp
sp = 0
FOR i = 0 TO n - 1
sp = sp + (a2 * (a + h / 2 + i * h) ^ 2 + a1 * (a + h / 2 + i * h) + a0)
NEXT i
sp = sp * h
LOOP UNTIL ABS(sp - s1) / 3 < E OR n = n1
PRINT "Integral po formule srednih pryumougolnikov:"; sp
'formila trapecii
n = 1
h = (b - a)
st = (h / 2) * ((a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0))
DO
n = 2 * n
h = (b - a) / n
s1 = st
st = ((a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0))
FOR i = 1 TO n - 1
st = st + 2 * (a2 * (a + i * h) ^ 2 + a1 * (a + i * h) + a0)
NEXT i
st = st * (h / 2)
LOOP UNTIL ABS(st - sl) / 3 < E OR n = n1
PRINT "Integral po formule trapecii:"; st
'formula Simpsona `
n = 2
h = (b - a)
ss = (h / 3) * ((a2 * a ^ 2 + a1 * a + a0) + 4 * (a2 * ((a + b) / 2) ^ 2 + a1 * ((a + b) / 2) + a0) + (a2 * b ^ 2 + a1 * b + a0))
DO
n = 2 * n
h = (b - a) / n
s1 = ss
c = 4
x = a
ss = (a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0)
FOR i = 1 TO n - 1
x = x + h
ss = ss + c * (a2 * (a + i * h) ^ 2 + a1 * (a + i * h) + a0)
c = 6 - c
NEXT i
ss = ss * (h / 3)
LOOP UNTIL ABS(ss - sl) / 15 < E OR n = n1
PRINT "Integral po formule Sim psona:"; ss
End

При запуске программы, высчитывается только первый интеграл, а дальше программа останавливается даже без возможности выхода. При разбиении программы на три маленьких, второй и третий методы также не идут, а останавливаются после команд INPUT.
Подскажите, пожалуйста, в чем может быть ошибка
Заранее спасибо
Буду очень благодарна за ответ. Спасибо.

Отправлен: 02.05.2010, 20:01
Вопрос задал: Ushastik1985, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Megaloman, Профессионал :
Здравствуйте, Ushastik1985.
Я обнаружил в Вашем коде ошибки (Вы перепутали l (эль) и 1 (единицу), плюс считаю более надёжным изменить условие Untill
Не проверял правильность, как Вы запрограммировали формулы, есть некоторые сомнения.
Было бы лучше, если бы Вы явно написали Вашу подинтегральную функцию и, соответственно,
Формулу прямоугольников, Формулу трапеций, Формула Симпсона, чтобы не искать их по справочникам,
чтобы можно было тщательнее проверить Ваш код
Ниже Ваш слегка подправленный код
Код:
a0 = 3.056565
a1 = -.0227886#
a2 = -1.080304E-02

INPUT "Нижняя граница интеграла:"; a
INPUT "Верхняя граница интеграла:"; b
INPUT "Точность вычисления:"; E
INPUT "Количество интегралов: "; n1

' ---------------------------------------------------------------------
'Формула средних прямоугольников

n = 1
h = (b - a)
sp = h * (a2 * ((a + b) / 2) ^ 2 + a1 * ((a + b) / 2) + a0)

DO
n = 2 * n
h = (b - a) / n
s1 = sp
sp = 0

FOR i = 0 TO n - 1
sp = sp + (a2 * (a + h / 2 + i * h) ^ 2 + a1 * (a + h / 2 + i * h) + a0)
NEXT i

sp = sp * h

LOOP UNTIL ABS(sp - s1) / 3 < E OR n >= n1 ' !!! Надёжнее >=

PRINT "Интеграл по формуле средних прямоугольников:"; sp

' ---------------------------------------------------------------------

'Формула трапеции
n = 1
h = (b - a)
st = (h / 2) * ((a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0))

DO
n = 2 * n
h = (b - a) / n
s1 = st
st = ((a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0))

FOR i = 1 TO n - 1
st = st + 2 * (a2 * ( a + i * h) ^ 2 + a1 * (a + i * h) + a0)
NEXT i
st = st * (h / 2)
LOOP UNTIL ABS(st - s1) / 3 < E OR n >= n1 ' !!! Ошибка было sl а надо s1

PRINT "Интеграл по формуле трапеции:"; st

' ---------------------------------------------------------------------

'Формула Симпсона

n = 2
h = (b - a)

ss = (h / 3) * ((a2 * a ^ 2 + a1 * a + a0) + 4 * (a2 * ((a + b) / 2) ^ 2 + a1 * ((a + b) / 2) + a0) + (a2 * b ^ 2 + a1 * b + a0))

DO
n = 2 * n
h = (b - a) / n
s1 = ss
c = 4
x = a
ss = (a2 * a ^ 2 + a1 * a + a0) + (a2 * b ^ 2 + a1 * b + a0)

FOR i = 1 TO n - 1
x = x + h
ss = ss + c * (a2 * (a + i * h) ^ 2 + a1 * (a + i * h) + a0)
c = 6 - c
NEXT i

ss = ss * (h / 3)

LOOP UNTIL ABS(ss - s1) / 15 < E OR n >= n1 ' !!! Ошибка было sl а надо s1

PRINT "Интеграл по формуле Симпсона:"; ss

END



Однако, на мой взгляд, задачу было бы правильнее решить в виде последовательного вызова функций для каждого метода, причём каждая функция при вычислении подинтегральной функции могла бы обращаться к оформиленной общей функции для трёх методов, например

Код:
FUNCTION PodInt
(x)
' Код для вычисления подинтегральной функции
PodInt= ..................................
END FUNCTION


Если приведёте все формулы, с удовольствием их перепрограммирую так, как я считаю нужным

-----
Нет времени на медленные танцы

Ответ отправил: Megaloman, Профессионал
Ответ отправлен: 02.05.2010, 21:34
Номер ответа: 261160

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261160 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.03.2010

    В избранное