Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
1

Приближённое вычисление определённого интеграла. Исправление ошибок в коде

23.02.2012, 15:28. Просмотров 1628. Ответов 13
Метки нет (Все метки)

Цель программы: вычислить неопределённый интеграл некоторой функции приближённо. Ошибки в участке кода, содержащем эту самую математическую функцию (у меня квадратичная). Объясните, пожалуйста, как их исправить. Перевод оповещений компилятора (в комментариях) мне ни о чём не сказал. Заранее спасибо.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
double f (double x) {
    f = x*x; /*в этой строке ошибка: lvalue required as left operand of assignment*/
    return f; /*тут тоже ошибка: incompatible types when returning type 'double (*)(double)' but 'double' was expected*/
};
 
int main() {
    double a, b; /*начало и конец отрезка, на котором надо найти интеграл*/
    unsigned int n; /*число отрезков, на которые разбиваем [a; b] для вычисления интеграла*/
    double h, s; /*шаг и сумма, в которую накапливаем значение*/
    unsigned int i; /*счётчик*/
 
    scanf("%f %f %d", &a, &b, &n);
 
    h = (b - a)/n;
    s=0;
 
    for (i=0; i<n; i++) {
        s += f(a+i*h); /*увеличиваем сумму на значение функции в точке a+i*h*/
    };
 
    s *= h;
 
    printf("%f", s);
 
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 15:28
Ответы с готовыми решениями:

Исправление ошибок в коде
Помогите исправить ошибки в коде на Си: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include...

Схема Бернулли с большим количеством испытаний - исправление ошибок в коде
double BernulliProb (int m, int n, double p, double q)//m - благоприятствующие исходы, n - всего...

Задачки на исправление ошибок
Справился с заданием A, есть кривое решение задания Г И я не понимаю, какая может быть ошибка в...

Исправление ошибок ввода
Хочу исправить возможность ошибочного ввода меню состоит из цифр поэтому сделал int,если нажать на...

Исправление ошибок в коде
Нужно исправить все ошибки в этом коде. Заранее спасибо.

13
HardMorg
3 / 26 / 9
Регистрация: 29.08.2010
Сообщений: 204
23.02.2012, 15:29 2
Цитата Сообщение от Sledovatel Посмотреть сообщение
Цель программы: вычислить неопределённый интеграл некоторой функции приближённо. Ошибки в участке кода, содержащем эту самую математическую функцию (у меня квадратичная). Объясните, пожалуйста, как их исправить. Перевод оповещений компилятора (в комментариях) мне ни о чём не сказал. Заранее спасибо.

C
1
2
3
4
5
6
#include <stdio.h>
 
double f (double x) {
    f = x*x; /*в этой строке ошибка: lvalue required as left operand of assignment*/
    return f; /*тут тоже ошибка: incompatible types when returning type 'double (*)(double)' but 'double' was expected*/
};
там нужно
double f(double x) {
return x*x;
}
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
23.02.2012, 15:39  [ТС] 3
Теперь программа компилируется, но при любых входных данных выводится следующее:
1.#INF00
0
samdavydov
60 / 21 / 2
Регистрация: 23.02.2012
Сообщений: 36
23.02.2012, 15:41 4
Sledovatel, смотри,
у тебя есть функция, в математическом смысле. f(x) = x*x.

Можно считать, что это такая коробочка, что 5 ---> f(x) ----> 25.
Тут мы неявно предполагаем, что функция верна для всех действительных чисел.

В С++ похоже. Объявляя функцию, ты объявляешь коробочку.
Но компьютер не умеет неявно предполагать, поэтому мы явно говорим ему, что на входе коробочки действительное число и на выходе действительное число.

C++
1
double f(double x)
Теперь надо наполнить коробочку смыслом:

C++
1
2
3
4
5
double f(double x)
{
    double result = x * x; // поместить x * x в result. 
    return result; вернуть result во внешний мир.
}
Можно сразу возвращать результат выражения, без помещения во временную переменную:
C++
1
2
3
4
double f(double x)
{
    return x * x; вернуть значение x * x во внешний мир.
}
____________
http://zmartzoft.ru
0
23.02.2012, 15:41
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
23.02.2012, 15:45  [ТС] 5
Понял, т.е. можно было внутри ещё одну переменную объявить, которой присвоить значение функции, и потом вернуть значение этой переменной.

Но результат, который выдаёт программа, всё равно некорректный.
0
samdavydov
60 / 21 / 2
Регистрация: 23.02.2012
Сообщений: 36
23.02.2012, 15:51 6
Ты используешь вещественные числа двойной точности, но в scanf поставил флаг для одинарной.
Они занимают разное количество места в памяти и поэтому неверно инициализируются.

Нужно %f заменить на %lf (l - маленькая L. long float), если используется double. Или везде double заменить на float.
1
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
23.02.2012, 16:08  [ТС] 7
Разобрался. Теперь вроде нормально.
Но если ввести слишком большое значение n (чтобы интеграл вычислить точнее), то программа вообще не выдаёт результат.
0
Том Ардер
Модератор
Эксперт по математике/физике
3873 / 2481 / 332
Регистрация: 15.06.2009
Сообщений: 4,583
23.02.2012, 16:21 8
Цитата Сообщение от Sledovatel Посмотреть сообщение
слишком большое значение n
А можно конкретнее? И указать все исходные данные
0
samdavydov
60 / 21 / 2
Регистрация: 23.02.2012
Сообщений: 36
23.02.2012, 16:33 9
Вместо
C++
1
2
3
4
5
    for (i=0; i<n; i++) {
        s += f(a+i*h); /*увеличиваем сумму на значение функции в точке a+i*h*/
    };
 
    s *= h;
Сделай так:
C++
1
2
3
    for (i=0; i<n; i++) {
        s += f(a+i*h) * h;
    };
Если n очень большое, то у тебя возможны две проблемы:
1. Переполнение sum. Ты ведь складываешь квадраты чисел, а это могут быть очень большие числа.
2. h = 0. В компьютере точность вещественных чисел конечна и если поделить b - a на большое число, то оно округлится к 0.

Второй пример кода спасает от первого случае, но не от второго. Можешь попробовать выводить h на печать и смотреть, чему оно равно.
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
23.02.2012, 16:41  [ТС] 10
Ну, например,
0 1 1000000000000

Добавлено через 7 минут
samdavydov, попробую

Хотя в случае с 0 1 1000000000000 программа выдала результат (я просто не дождался), но он неправильный. Должен быть примерно 0,333..., а выдаёт 0,004703
Это странно, т.к. с увеличением n точность должна увеличиваться, а здесь что-то совсем не то.
0
Том Ардер
Модератор
Эксперт по математике/физике
3873 / 2481 / 332
Регистрация: 15.06.2009
Сообщений: 4,583
23.02.2012, 16:45 11
При таком количестве разбиений интервала интегрирования время расчёта должно быть ненормально большим - часы и даже сутки. А точности не будет - все значащие цифры будут съедены ошибками округления в арифметических операциях. В учебниках по численным методам это хорошо изложено.
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
23.02.2012, 16:48  [ТС] 12
Цитата Сообщение от Том Ардер Посмотреть сообщение
В учебниках по численным методам это хорошо изложено.
Какой, например, можете посоветовать почитать (я на первом курсе)?
0
samdavydov
60 / 21 / 2
Регистрация: 23.02.2012
Сообщений: 36
23.02.2012, 16:50 13
Точноть должна увеличиваться, если представление чисел допускает бесконечную точность.
В компьютере это не так.

Одна миллиардная в квадрате - это 0, с точки зрения компьютера. И две миллиардных в квадрате. И т.д. Достаточно много значений из интервала 0 1 будут равны 0. Поэтому ответ настолько меньше ожидаемого.

Вместо увеличения числа шагов лучше воспользоваться более точной формулой. Например, формулой Симпсона.
1
Том Ардер
23.02.2012, 17:29     Приближённое вычисление определённого интеграла. Исправление ошибок в коде
  #14

Не по теме:


Ветка форума "Литература по численным методам"


1)Березин, Жидков Методы вычислений, т.1

2)Название:Численные методы и программное обеспечение
Автор: Д. Каханер, К. Моулер, С. Нэш
Издательство: Мир
Год издания: 1998
Формат: DJVU
Размер:15 Мб

Книга американских специалистов, представляющая собой расширенный и существенно переработанный вариант известной книги Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений, М.: Мир, 1980. Несмотря на измененный авторский состав, в книге сохранен неформальный стиль изложения, помогающий читателю освоить современное программное обеспечение по численным методам. Для специалистов по вычислительной и прикладной математике, аспирантов и студентов, изучающих численные методы и программное обеспечение ЭВМ.

3)Название: Машинные методы математических вычислений
Автор: Дж. Форсайт, М. Малькольм, К. Моулер
Год издания: 1980
Издательство: Мир
Страниц: 280 + исходники
Формат: DJVU
Размер: 4,3 Мб (+3%)

Обычно в учебниках по численному анализу изложение метода доводится до рабочих формул, иногда с обсуждением тонкостей и подвохов, чтобы читатель при необходимости сам мог составить программу нужного ему метода. Авторы, напротив, считают, что высококачественные программы, т. е. программы, обходящие возможные машинные нули и переполнения, учитывающие нерегулярности вычислительной схемы метода, оценивающие достигнутую точность, обрабатывающие аварийные ситуации с выдачей диагностики,— такие программы могут и должны писать только специалисты. Интересно в связи с этим обсуждение в конце гл. 2 того, какой должна быть программа решения... квадратного уравнения.
Итак, составление стандартных программ — дело специалистов; массовому же пользователю ЭВМ знакомство с методом, как правило, необходимо лишь в той мере, чтобы суметь правильно обратиться к соответствующей подпрограмме, правильно интерпретировать выданные ею результаты, верно реагировать на нестандартные исходы и т. д.

4)Калиткин, #Численные методы#
Издательство: МГУ | Страниц: 704 | Формат: djvu | Размер: 10 мб
Качество: отличное


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

5)Название: Введение в численные методы
Автор: Самарский А.А.
Издательство: Наука
Год издания: 1982
Страниц: 269
Язык: Русский
Формат: djvu
Качество: хорошее
Размер: 5.7 Мб

Книга написана на основе курса лекций, читавшихся автором на факультете вычислительной математики и кибернетики МГУ, и предназначается для ознакомления с началами численных методов.
Теория численных методов излагается с использованием элементарных математических средств, а для иллюстрации качества методов используются простейшие математические модели.
В книге рассматриваются разностные уравнения, численные методы решения обыкновенных дифференциальных уравнений, линейных и нелинейных алгебраических уравнений, разностные методы для уравнений в частных производных.
Для студентов факультетов и отделений прикладной математики вузов.

6)Название: Численные методы и программирование на ФОРТРАНе
Автор: Д. Мак-Кракен, У. Дорн
Издательство: Мир
Год: 1977
Формат: DjVu
Размер: 5,11 Мб
Качество: Хорошее
Язык: Русский

Книга является руководством по структуре и использованию алгоритмического языка ФОРТРАН при решении вычислительных задач на современных электронных машинах.
Специфика и простота трансляторов для ФОРТРАНа, эффективность оттранслированных программ и методика выявления и оценки ошибок выгодно отличают этот язык от других алгоритмических языков. Все это обусловило широкое внедрение ФОРТРАНа в технику программирования за рубежом.
Одновременно в книге подробно излагаются тщательно отобранные численные методы, применение которых иллюстрируется на многочисленных практических примерах.

1
23.02.2012, 17:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2012, 17:29
Привет! Вот еще темы с ответами:

Исправление ошибок в коде
Компилятор находит ошибки , просьба помочь исправить ошибки в коде #include &lt;avr/io.h&gt;...

Исправление ошибок в коде
Прошу помощи в исправлении кода для сортировки двумерного массива по убыванию методом Шелла. Сам...

Исправление ошибок в коде
При компиляции выдает ошибку expected unqualified-id before 'while' #include &lt;iostream&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru