Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.120.16] |
|
Сообщ.
#1
,
|
|
|
Вот я решил написать программку, которая бы умела интегрировать функцию. Решил сделать самым простым методом.
Итак, S - сумма площадей манюсеньких прямоугольничков шириной TOL=0.001 и высотой y2 (micros). Пользователь вводит с клавиатуры промежутки интегрирования, тоесть a и b . После этого точка отсчета x1=a (присваивается а). Дальше выполняем цикл while (x2<=b). Находим x2=x1+TOL, находим y2 (функция x^2), находим площадь манюсенького прямоугольничка micros=fabs(y2)*TOL (ибо его ширина равна TOL ). в ОБЩУЮ сумму додаем полученное значение площади масипусенького прямоугольничка и x1=x2. Все вроде как идеально, только нифига не работает. Прога выдает результат ноль. В чем проблема??? И можно ли ваще реализовать интегрирование вышеописаным методом? Жду помощи #include <iostream.h> #include <math.h> #include <conio.h> void main() { clrscr (); float S,micros,x1,x2,y2,a,b,TOL; cout<<"Vvodim promeshutki integrirovania"; cout<<"Vvedite a"; cin>>a; cout<<"Vvedite b"; cin>>b; S=0; TOL=0.001; x1=a; micros=0; while (x2<b) { x2=x1+TOL; y2=x2*x2; micros=fabs(y2)*TOL; S=S+micros; x1=x2; } cout<<"Znachenie integrala x^2 na promeshutke ot " <<a<<"do "<<b<<" Ravno"<< S; getch (); } |
Сообщ.
#2
,
|
|
|
Цитата Vitalik2388 @ Все вроде как идеально А ты уверен, что на момент начала цикла x2 не будет больше, чем b? Я к тому, что ты x2 (опять же, до цикла) нигде не инициализируешь, а уже используешь... |
Сообщ.
#3
,
|
|
|
всё норм считает, может, Вы вводите a меньшее, чем b?
Добавлено volvo877 +1 |
Сообщ.
#4
,
|
|
|
Цитата Radagast @ А ты уверен, что на момент начала цикла x2 не будет больше, чем b? Я к тому, что ты x2 (опять же, до цикла) нигде не инициализируешь, а уже используешь... Ой... А это действительно так. Теперь все нормально работает. С такой переменной TOL считает не хуже MathCad! Вот теперь ещё вопросик. Как сделать так, чтобы пользователь мог вводить ФУНКЦИЮ ВРУЧНУЮ!!! Я поменяю x2 на x, это не вопрос вообще. Но, чтобы получилось так, как будто я вручную ввел строку интегрируемой функции. А то от программы, что считает одну функцию толку ваще мало. Задача сводится к упрошенной. 1. Введите функцию (пользователь вводит функцию); 2. Введите x (юзик вводит x) 3. Значение функции y(x)= (прога посчитала) |
Сообщ.
#5
,
|
|
|
Тебе сюда: Как разобрать строку с арифметическим выражением и дальше по линкам
|
Сообщ.
#6
,
|
|
|
Vitalik2388 - для более точных методов интегрирования почитай "Численное интегрирования" из курса "Численный анализ"
при вводе b надо проверять если b < a правильно было бы написать cout<<"Vvedite n";//Число шагов иначе у тебя может быть ситуация когда площадь одного прямоугольника не будем считаться // например x2 > b a x1 < b ->>> выход из цикла и ты теряешь прямоугольник [x1, b ] cin>>n; TOL = ( b - a ) / n; x2=x1+TOL; while (x2<=b) { y2=x2*x2; micros=fabs(y2)*TOL; S=S+micros; x1=x2; x2=x1+TOL; } я бы так это написал бы .... cout<<"Vvedite n" cin>>n; h = ( b - a ) / n; for( i = 0; i <= n; i++) { y = f ( a + i*h );// функция S = S + y * h; } |
Сообщ.
#7
,
|
|
|
Цитата vovan01 @ при вводе b надо проверять если b < a integrate(f(x), x, a, b) == -integerate(f(x), x, b, a) |