Решение систем уравнений в паскале

Задача

Требуется определить, сколько можно преобрести ручек (по цене 10 руб.), карандашей (5 руб.) и ластиков (2 руб.) на 100 рублей. При этом всего предметов должно быть 30.

Решение

Обозначим искомое количество ручек, карандашей и ластиков через переменные a , b и c соответственно.

Цены предметов: pa , pb , pc .

Количество предметов: qty .

Сумма покупки: sum .

Алгоритм решения задачи:

Составим систему уравнений.
Уравнение суммы покупки: 10*a + 5*b + 2*c = 100
Уравнение количества предметов: a + b + c = 30

Заменим числа соответствующими переменными:
Уравнение суммы покупки: pa*a + pb*b + pc*c = sum
Уравнение количества предметов: a + b + c = qty

Чтобы перебрать все возможные варианты сочетания переменных a , b и с , надо использовать три цикла, вложенные друг в друга.
Если при каких-либо значениях a , b и c оба уравнения будут истинны, значит эти значения являются решением для системы уравнений.
Система уравнений может иметь несколько решений или не иметь ни одного.

Программа на языке Паскаль:

При заданных данных программа выдаст два варианта решения системы уравнений:

Программа может выглядеть немного по-другому. При заданных значениях a и b определить c можно по формуле qty — a — b . В таком случае код будет выглядеть так:

  • Попроси больше объяснений
  • Следить
  • Отметить нарушение

Lyudmilaloktev 16.06.2014

Что ты хочешь узнать?

Ответ

Var x,y,f,z,a:real;
begin
write(‘Введите x,z: ‘);
readln(x,z);
if x>13 then f:=-3/(x+1)
else f:=-(x*x*x)+9;
if x 1 then y:=x*x*x
else y:=x;
if x>z then a:=y*z*z/(3+power(2,3/5))
else a:=2*cos(x+z);
writeln(‘F(x)=’,f);
writeln(‘Y=’,y);
writeln(‘A=’,a);
end.

Если функции power нет, то вместо
if x>z then a:=y*z*z/(3+power(2,3/5))
напечатать
if x>z then a:=y*z*z/(3+exp(3/5*ln(2))

Решение систем линейных алгебраических уравнений

2. Метод Гаусса

Реализация метода на языке Паскаль

Потребуется описание используемых типов для расширенной матрицы коэффициентов и для вектора значений переменных:

Читайте также  Программа для определения dns серверов

type mat=array[1..20,1..21] of real;

vec=array[1..20] of real;

var n:integer;

a:mat; x:vec;

Ввод матрицы наиболее эффективно реализовать из файла данных. Для этого потребуется файловый тип и файловая переменная

var f:text;

В основной части программы ввод можно организовать следующим образом:

Write(‘Введите число уравнений N = ‘); readln( n );

reset(f);

for i:=1 to n do

begin

for j:=1 to n+1 do read(f,a[i,j]);

readln(f);

end;

close(f);

Прямой ход метода Гаусса (формирование треугольной матрицы коэффициентов) может выглядеть так:

for k:=1 to n do

begin

s:=a[k,k];j:=k;

for i:=k+1 to n do

begin

r:=a[i,k];

if abs(r)>abs(s) then

begin

s:=r; j:=i;

end;

end;

if s=0 then

begin

writeln(‘Переставьте уравнения чтобы на главной диагонали не было нулевых коэффициентов !’);

halt;

end;

if j<>k then

for i:=k to n+1 do

begin

end;

for j:=k to n+1 do a[k,j]:=a[k,j]/s;

for i:=k+1 to n do

begin

r:=a[i,k];

for j:=k to n+1 do

a[i,j]:=a[i,j]-a[k,j]*r;

end;

end;

Обратный ход метода Гаусса (вычисление вектора значений переменных) может выглядеть так:

if s<>0 then

for i:=n downto 1 do

begin s:=a[i,n+1];

for j:=i+1 to n do s:=s-a[i,j]*x[j];

x[i]:=s;

end;

Остаётся только вывести результат и сделать проверку.

Ссылка на основную публикацию
Adblock
detector