Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 17:52   #1
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
Восклицание Процедурный тип. Интегралы.

Здравствуйте, помогите пожалуйста написать код для задачи.

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

Математическое ришение:
на [-4;4]
f1) интеграл = 146,667

f2) интеграл = 101,333

f3) интеграл = 88

Ответ: f3)

Наробки:
(не могу написать процедуру для вычесления интегралов)
Код:
program task17;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  math;
type
  func = function(x:real):real;

var
  Steps : integer;
  mas   : array[1..3] of func;

function func1(x : real):real;
begin
  func1 := 4*sqr(x)+2*x-3;
end;

function func2(x : real):real;
begin
  func2 := 2*sqr(x)-5*x+2;
end;

function func3(x : real):real;
begin
  func3 := 3*sqr(x)+8*x-5;
end;

var Xmin, Xmax: integer;
begin
  mas[1] := func1;
  mas[2] := func2;
  mas[3] := func3;
  Write('Input Xmin:'); Readln(Xmin);
  Write('Input Xmax:'); Readln(Xmax);

  Writeln('Press Enter to Exit');
  Readln;
end.
kuy вне форума Ответить с цитированием
Старый 25.11.2011, 21:45   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Тут есть 2 варианта действий.
1) Написать процедуру численного интегрирования, какимнибуть из методов. (для неё я немного переделал код интегрирования методом прямоугольников из одного из ваших постов на который я отвечал). С.м. программу в конце.
Можно также для численного интегрироваия использовать метод Симпсона(метоп парабол) его суть в том что фунция интерполируеться какразаки полиномами 2й степени т.е. приблеженный метод даст точный результат. Причем для полинома 2й степени можно обойтись N=1. т.е. достаточно вычислить функцию всего в трёх точках. Для N=1 я сделал функцию IntegrSinglSimpson. Но она дасто правильный результат если полином небольше 2й степени!
Реализовывать метод симсона для N>1 мне лень. Но если захотите реализовать именно его. Могу помочь.

2) У вас в задании сказанно что функция заданна полиномом. А интеграл от полинома очень просто вычислить. (см. рисунок) Поэтому можно сделать функцию которая вычисляет интеграл от полинома заданного коэфициентами при x.


Вот эти оба варианта реализовал в одной программе для сравнения.
Ну а вы уж сами выбирите вариант. И сделайте сравнение этих интегралов.
Код:
type
  func = function(x:real):real;
function Integr(f:func;a:real;b:real;n:longint):real;
var dx:real;
    i:longint;
    s:real;
Begin
  dx := (b-a)/n;
  s := 0;
  for i := 0 to n-1 do
    s := s + f(a+dx*i)*dx;
  Integr := s;
End;

function IntegrSinglSimpson(f:func;a:real;b:real):real;
Begin
  IntegrSinglSimpson := ((b-a)/6)*(f(a)+4*f((a+b)/2)+f(b));
End;


const PolinomPower=2;
type Polinom = array[0..PolinomPower] of real;

function PolinomIntegr(const p:Polinom;a:real;b:real):real;
var s:real;
    i:integer;
    xapower:real;
    xbpower:real;
Begin
  xapower := 1;
  xbpower := 1;
  s := 0;
  for i := 0 to PolinomPower do Begin
    xapower := xapower*a;
    xbpower := xbpower*b;
    s := s + (p[i]/(i+1))*(xbpower - xapower);
  End;
  PolinomIntegr := s;
End;

function func1(x : real):real;
begin
  func1 := 4*sqr(x)+2*x-3;
end;

function func2(x : real):real;
begin
  func2 := 2*sqr(x)-5*x+2;
end;

function func3(x : real):real;
begin
  func3 := 3*sqr(x)+8*x-5;
end;

var p:Polinom;
begin
  writeln('S=',Integr(func1,-4,4,100000):10:5);
  writeln('S=',IntegrSinglSimpson(func1,-4,4):10:5);

  p[0] := -3;
  p[1] := 2;
  p[2] := 4;
  writeln('S=',PolinomIntegr(p,-4,4):10:5);
end.
Изображения
Тип файла: bmp 125.bmp (6.7 Кб, 161 просмотров)
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 25.11.2011 в 22:40.
val_nnm вне форума Ответить с цитированием
Старый 26.11.2011, 00:11   #3
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
По умолчанию

val_nnm, спасибо большое, дальше уже легко, розберусь.
kuy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедурный тип в Delphi <Maria> Помощь студентам 1 14.11.2010 18:03
Процедурный тип в C++Builder sneksnek2006 C++ Builder 4 14.10.2010 10:46
Процедурный Brainfuck tunyash Софт 0 17.06.2010 08:55
Процедурный тип в паскале tanyhaftv Помощь студентам 0 24.03.2010 09:07
Интегралы Golovastik Общие вопросы C/C++ 9 03.06.2009 21:11