Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Решение задач на Pascal. Форум 2
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ]
Модераторы: paradise, KMA
  

Siriusss



Новичок

Помогите в решении задачи по численным. Если не в тему, просьба переместить.
Дана функция f(x)=1/c^2*cos(cx). с=0,081, h=0,155
Составить программу, которая

-------------------------------------------------------------
Вот что сделано:
program chislen_differencir;
const h=0.155;n=21;
type mas=array[0..n]of real;
var x,y,z,pr,F,L,dy,dyy:mas;
   a,b,c,q:real;
   i:integer;
begin
{Vyvod znachenii funkcii s rasschitannym shagom na intervale}
{a=-0.074}
write('a='); readln(a);
{b=3.336}
write('b='); readln(b);
{c=0.081}
write('c='); readln(c);
for i:=0 to n do
 begin
 x[ i ]:=a+i*h;
 y[ i ]:=1/(sqr(c))*cos(c*x[ i ]);
 write('x[', i ,']=',x[ i ]:6:4,', to4n_zna4_f(x[', i ,'])=',y[ i ]:10:6,';');
 readln;
 end;
 writeln;
 writeln('Vychislenie priblizhennogo znacheniya proizvodnoi v to4kah:');
for i:=0 to n-1 do
 begin
 z[ i ]:=c+i*h;
 q:=(z[ i ]-x[ i ])/h;
 dy[ i ]:=y[i+1]-y[ i ];
 dyy[ i ]:=dy[i+1]-dy[ i ];
 L[ i ]:=y[ i ]+q*dy[ i ]+q*(q-1)*dyy[ i ]/2;интерполяционный многогчлен Ньютона, квадратичная интерполяция
 F[ i ]:=(L[i+1]-L[i-1])/2*h; приближенноевычисление производной
 pr[ i ]:=-1/c*sin(c*z[ i ]);точное вычисление производной

 write('z[', i ,']=',z[ i ]:6:4,'    ',pr[ i ]:7:5,'   , pribl_zna4_proizv_f`(z[', i ,'])=',F[ i ]:10:6,';');
 readln;
 end;
 writeln;
 readln;
end.
Проблема в том, что приближенное решение неверное и в корне не соответствует точному, а также формула вычисления производной опирается на i-1 и i+1 значения функции - как быть с производной при i=0?

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

Если задан явный вид функции, то выражение для производной часто оказывается достаточно сложным и желательно его заменить более простым. Если же функция задана только в некоторых точках (таблично), то получить явный вид ее производных ввобще невозможно. В этих ситуациях возникает необходимость приближенного (численного) дифференцирования.

Простейшая идея численного дифференцирования состоит в том, что функция заменяется интерполяционным многочленом (Лагранжа, Ньютона) и производная функции приближенного заменяется соответствующей производной интерполяционного многочлена

(Сообщение отредактировал Siriusss 15 марта 2008 21:48)

-----
Иногда для того, чтобы выглядеть умным, полезно сделать что-нибудь дурное...

Всего сообщений: 28 | Присоединился: апрель 2007 | Отправлено: 15 марта 2008 19:23 | IP
ewgen



Новичок

Помогите пожалуста! нужен калькулятор но именно методом конечного автомата. я пока делаю упрощённую его модель(только сложение), но че то не получается. имеется три состояния: в первом состоянии автомат находится до тех пор пока на вход подаётся число, если подаётся '+' автомат переходит во второе состояние, а из этого состояния если подаётся на вход число переходим в третье состояние - результат, иначе - состояние ошибка
var s:string;
  a:integer;
function CheckMath(const S : String) : Integer;
type
TState = (Start, InDigit, AfterDigit, InOp, InLPrnt, InRPrnt);
var
State : TState;
i, currentNum,v, code : Integer;

begin
Result := 0;
currentNum := 0;
State := Start;
for i := 1 to Length(S) do
case State of
{-------------------------------------}
  Start:
    case S[ i ] of
      ' ': ;
      '0'..'9' : begin
                  val(s,v,code);
                  currentNum:=v;
                  result:=result+currentNum;
                  State:= InDigit;
                  end;
     { '+' :   State:= Start;
      '-' :   begin
               currentNum:=(-1);
               result:=result+currentNum;
               State:= AfterDigit;
              end;  }
    end;
{--------------------------------------}
  InDigit:      
    case S[ i ] of
      '0'..'9' : State:= Start;
      '+'      : State := AfterDigit;

     end;
{-------------------------------------}
  AfterDigit:
    case S[ i ] of
      '0'..'9' : begin
                  val(s,v,code);
                  currentNum:=v;
                  result:=result+currentNum;
                  State:= Start;
                  end;

    end;
{-------------------------------------}
  {InOp :
    case S of
      ' ' : ;
      '0'..'9' : State := InDigit;
    end;   }
{-------------------------------------}
end;  // case State of

CheckMath:=result;
 
end;
begin
writeln('введите строку');readln(s);
a:=CheckMath(s);
writeln(a);
end.

Всего сообщений: 6 | Присоединился: февраль 2008 | Отправлено: 15 марта 2008 22:42 | IP
Imhotep


Новичок

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

Составить алгоритм решения задачи: сколько можно купить быков, коров и телят, платя за быка 10р.,за корову - 5р., а за теленка - 0,5р., если на 100р. надо купить 100 голов скота.

Покупатель должен заплатить в кассу S рублей. У него имеются 1, 2, 5, 10, 50, 100,500 рублей. Сколько купюр каждого достоинства отдаст покупатель, если он начнет платить с самых крупных?

Помогите пожалуйста, а то я учусь пользоваться циклами.

Всего сообщений: 1 | Присоединился: март 2008 | Отправлено: 16 марта 2008 22:16 | IP
Guest



Новичок

Нужна помощь в решении следующей задачи:
Реализовать структуры данных «стек-динамический» и «очередь-динамическая».
Система состоит из процессора P, трёх очередей F0, F1, F2 и стека S. В систему поступают запросы на выполнение задач.
Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста, можно обрабатывать задачи из очереди F1. Если и она пуста, то можно обрабатывать задачи из очереди F2. Если все очереди пусты, то система находится в ожидании поступающих задач (процессор свободен), либо в режиме обработки предыдущей задачи (процессор занят). Если поступает задача с более высоким приоритетом, чем обрабатываемая в данный момент, то обрабатываемая помещается в стек и может обрабатываться тогда и только тогда, когда все задачи с более высоким приоритетом уже обработаны.

Всего сообщений: Нет | Присоединился: Never | Отправлено: 16 марта 2008 22:39 | IP
reina



Новичок

Окончательно запуталась в своей программе.
Задание:Определить является ли одна заданная строка зеркальной другой заданной строке. Создать главную программу, которая тестирует разработанный модуль. Данные можно вводить только в главной программе.
Собственно вот код:
unit UNit1;
Interface
type
   INT = integer;
   STR = string;
{var
i1,i2,i3:INT;  }
{procedure MIRRORSTRING (Source : STR; var RESULT :STR);}
procedure Compare (var InpStr:Str; var InpStr2:Str; var Source:str;
var k:boolean);

implementation
procedure MIRRORSTRING (var Source : STR; var RESULT :STR);
var i,k : integer;
begin
  k:=length(Source);
  RESULT:= Source;
  for i:=k downto 1 do
  RESULT[ k+1-i ]:=Source[ i ];
end;
    procedure Compare;{(var InpStr:Str; var InpStr2:Str;
     var Source:str); }
     begin
        MirrorString(InpStr2,Source);
     k:= InpStr=InpStr2; if not k then exit;
        InpStr:=Source;

     end;
end.


program UnUse1;
uses UNit1;

var
InpStr,Source : STR;
InpStr2:STR;
i : integer;
k:boolean;

begin

Writeln( 'Vvedite stroku');
readln ( InpStr );
writeln('Vvedite sl stroku');
readln(InpStr2);
COMPARE(InpStr2,InpStr2,Source,k);
if k then writeln( ' Mirrorstring:', k)
else writeln(k);
readln;
writeln('nazmite enter');
readln;
end.


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

Всего сообщений: 8 | Присоединился: февраль 2008 | Отправлено: 18 марта 2008 23:54 | IP
KMA



Долгожитель

Siriusss, уточняй математические модели свои, скорее всего ты неправильно представил функцию.

ewgen, одно дело теоретическая разработка, другое само программирование, тебе нужно либо очищать строку после ввода + скажем, а потом применять val, либо же запоминать с какого символа это идет. Во втором состоянии должен подаваться +, когда он подался, то автомат переходит в состояние 3 (AfterOperation), затем ждет пока не будет введен символ =, и только после него переходит в новое, последнее состояние.

reina, я бы тоже в такой процедуре запутался. Что значит зеркальное? Это значит что последний символ первой строки равен первому символу второй строки. Вот так бы и писала:

Code Sample:
 
function mirrorString (str1, str2: string): boolean;
var i: byte;
     _flag: boolean;  
Begin
    if length(str1)<>length(str2)
       then
         begin
           mirrorString:=false;
           exit
         end;
    i:=0;
    _flag:=true;
    while (_flag) and i<length(str1) do
     begin
      inc (i);
      if str1[ i ]<>str2[length(str2)-i+1]
         then _flag:=false
     end;
    mirrorString:=_flag
End;



Поэтому не надо экспериментировать и усложнять. Как правило самое лучшее решение то, которое самое простое.

-----
Gentoo, FreeBSD 7.2, PHP, JavaScript (jQuery), Python, Shell
Помогаю с задачами только на форуме.
Все мои действия четко согласуются с правилами раздела. Поэтому никаких претензий и обид.

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 20 марта 2008 20:42 | IP
reina



Новичок

Спасибо за решение только, я как раз вчера во всем разобралась сама..

Всего сообщений: 8 | Присоединился: февраль 2008 | Отправлено: 21 марта 2008 15:48 | IP
Guest



Новичок

Задача состоит в том что бы обчислить члены ряда модуль которых больший d.
Вот тело моей програмки
Code Sample:
 
program z_24;
uses crt;
var z, x, i, d, factorial:real;
     k, n:integer;
begin
       clrscr;
       write('Введіть значення змінної x=');
       readln(x);
       write('Введіть n=');
       readln(n);
       write('Введіть d=');
       readln(d);
       i:=x*x/2;
       z:=i;
       while abs(i)>=d do
        begin
          n:=n+1;
          factorial:= 1;
          for k:=1 to n do
             factorial:= factorial * k;
          i:=exp(n*ln(-1))*(exp(n*ln(x))/factorial);
          read;
        end;
      writeln('i=',i);
      read;
end.


Вообщем стыдно призаца но такая простинькая програмка у меня не работает я думаю проблема в том что я не в правильном порядке построил програму тоесть действия выполняются не в том порядке что должны. Помогите кто может!!

KMA: я тебе исправил оформление кода, на на будущее, если хочешь чтобы люди за что-то брались оформляй по человечески код.

(Сообщение отредактировал KMA 28 марта 2008 14:52)

Всего сообщений: Нет | Присоединился: Never | Отправлено: 27 марта 2008 21:27 | IP
KMA



Долгожитель

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

Code Sample:
 
factorial:=1;
for k:=1 to n do
factorial:=factorial*n;
...
while abs(i)>=d do
 begin
    n:=n+1;
    factorial:= factorial*n;  
    i:=exp(n*ln(-1))*(exp(n*ln(x))/factorial);
    read;
 end;



Далее. Ты не слишком ли мало под факториал отводишь. Я бы тебе советовал longInt, или если так хочешь вещественное число то уж double (extended).

И конечно самая тупая ошибка которая может быть
Code Sample:
 
i:=exp(n*ln(-1))*(exp(n*ln(x))/factorial);



Бери учебник математики за 10 класс (или в каком там логарифмы изучают) и повторяй определение логарифма

-----
Gentoo, FreeBSD 7.2, PHP, JavaScript (jQuery), Python, Shell
Помогаю с задачами только на форуме.
Все мои действия четко согласуются с правилами раздела. Поэтому никаких претензий и обид.

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 28 марта 2008 15:00 | IP
BadGirl



Новичок

Любимые мой помогите мне решить задачу!!!!! Пожалуйста!!!!Дан двумерный массив A[n;m] нужно найти сумму элементов по главной диаггонали затем каждый элемент массива разделить на эту сумму!!!!!

Всего сообщений: 1 | Присоединился: апрель 2008 | Отправлено: 4 апр. 2008 18:07 | IP

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ]

Форум работает на скрипте © Ikonboard.com