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;
Поэтому не надо экспериментировать и усложнять. Как правило самое лучшее решение то, которое самое простое.
|
Всего сообщений: 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 класс (или в каком там логарифмы изучают) и повторяй определение логарифма
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 28 марта 2008 15:00 | IP
|
|
BadGirl
Новичок
|
Любимые мой помогите мне решить задачу!!!!! Пожалуйста!!!!Дан двумерный массив A[n;m] нужно найти сумму элементов по главной диаггонали затем каждый элемент массива разделить на эту сумму!!!!!
|
Всего сообщений: 1 | Присоединился: апрель 2008 | Отправлено: 4 апр. 2008 18:07 | IP
|
|
|