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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2008, 08:44   #1
Darion
 
Регистрация: 14.07.2008
Сообщений: 5
По умолчанию Нужна помощь в доведении программы до рабочего состояния

Задача:
В гибридных интегральных схемах используются плоские пленочные катушки индуктивности в виде квадратной спирали.
Индуктивность такой катушки (в нГн) приближенно определяется по формуле:
L:=2.41*a*exp((5/3)*ln(N))*ln((8*a)/c)
где N - число витков, a=(R1+R2)/2, c=R2-R1, R1 и R2 - размеры внутреннего и внешнего витков катушки.
Задавшись числом витков N и размером R1, найдите параметр R2, обеспечивающий заданную индуктивность L (Значения N, R1 и L даны в таблице (6 вариантов))
Что нужно было сделать:
Интерфейс, решение функции, вывод данных о ней, о варианте и о переменных с константами + построить график.
Вот, что получилось.

Программа выдает ошибку "Invalid floating point operation"
Вложения
Тип файла: txt Текстовый документ.txt (10.9 Кб, 124 просмотров)
Тип файла: rar Project1.rar (248.0 Кб, 13 просмотров)

Последний раз редактировалось Darion; 14.07.2008 в 09:38.
Darion вне форума Ответить с цитированием
Старый 14.07.2008, 09:05   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Приложи файл программы, легче будет разобраться.
Цитата:
L:=2.41*a*exp((5/3)*ln(N))*ln((8*a)/c);
Возможен логарифм отрицательного числа.
Цитата:
my:=(ht/abs(y2-y1))/1.5;
Возможно деление на ноль.
Тип Real для таких вычислений по-моему не годится.

Последний раз редактировалось puporev; 14.07.2008 в 09:51.
puporev вне форума Ответить с цитированием
Старый 14.07.2008, 10:00   #3
Darion
 
Регистрация: 14.07.2008
Сообщений: 5
По умолчанию

Как тогда грамотно поправить?
Darion вне форума Ответить с цитированием
Старый 14.07.2008, 10:23   #4
Darion
 
Регистрация: 14.07.2008
Сообщений: 5
По умолчанию

Я заменил их типы на extended, но все равно не выходит...
Darion вне форума Ответить с цитированием
Старый 14.07.2008, 11:02   #5
Virtson
Владимир М.
Участник клуба
 
Аватар для Virtson
 
Регистрация: 30.10.2006
Сообщений: 1,289
По умолчанию

деление на 0 - проверяйте в каждом операторе /
Берегите друг друга!
Virtson вне форума Ответить с цитированием
Старый 15.07.2008, 00:37   #6
Darion
 
Регистрация: 14.07.2008
Сообщений: 5
По умолчанию

Я покопался в программе, понял, что криво записал функцию.
Выразил ручками гигантское уравнение, в котором неизвестна только искомая переменная. И не пашет... Нужна помощь...
Вложения
Тип файла: rar Project1.rar (248.2 Кб, 11 просмотров)
Darion вне форума Ответить с цитированием
Старый 15.07.2008, 08:08   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Ваша формула стала ничуть не лучше, чем была. Из первоначальной функции нужно вытащить R2 и привести функцию к виду
R2(N,L,R1:extended):extended;
begin
R2:=преобразованная функция, где через указанные три параметра, определяется значение R2. Тут немного надо знать математику.
puporev вне форума Ответить с цитированием
Старый 15.07.2008, 11:00   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Сделал новый пост, чтобы автор получил уведомление.
P.S. Сам попробовал это сделать, сходу ничего не получилось. Подумал, что если такое преобразование сделать нельзя, или оно ни к чему не приведет, то можно попробовать искать R2 по другому.
Код:
Function R2(L,N,R1:extended):extended;
Var Li,r,dr,e:extended;
begin
r:=R1;
while abs(L-Li)>= e do
       begin
          r:=r+dr;
          Li:=2.41*((r1+r)/2)*exp((5/3)*ln(N))*ln((8*((r1+r)/2))/(r-r1));
       End;
R2:=r;
End;
Где Li-искомая индукция, r- по сути R2, dr- приращение, e-необходимая точность расчетов. Здесь мы начиная от R1 наращиваем значение R2, пока не получим значение нужной индукции с заданной точностью.
Но вот проблема: и так программа не работает. Я взял Вашу формулу и проделал манипуляции в Экселе. Ни при каком R2 не получается нужная индукция, следовательно в исходной формуле ошибка, или скобки неправильно, или еще что-то, трудно сказать.
Лист Экселя прилагаю.
Вложения
Тип файла: rar Книга1.rar (2.3 Кб, 8 просмотров)
puporev вне форума Ответить с цитированием
Старый 15.07.2008, 22:02   #9
Darion
 
Регистрация: 14.07.2008
Сообщений: 5
По умолчанию

Вот само задание, формулы вроде я все верно написал и выразил
Изображения
Тип файла: jpg CIMG0843.jpg (35.4 Кб, 119 просмотров)
Darion вне форума Ответить с цитированием
Старый 16.07.2008, 11:57   #10
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Действительно с формулой все в порядке, просто я взял такие исходные данные при которых она не выполнима. Посмотрел программу дальше. Нам оказывается не нужно вычислять R2, а брать его с графика. Я построил приближенные графики в Excel. Из них видно, во-первых, что значений R2 не одно, а два, и нужно решить которое Вам нужно. Во-вторых, при шаге 0,01 никогда не получится точность 0,00001. Скорее наоборот, если поменять их местами.
При построении графика мы по формуле считаем значение Li-изменяющейся индукции. Нам надо найти значение(значения) R2, при котором abs(L-Li)<=e;
Код:
Function Li(N,R1,R2:extended):extended;//основная функция с тремя параметрами
//параметры N,R1 задаются, параметр R2 – переменная.
 var a,c:extended;
 begin
 a:=(R2+R1)/2;
 c:=R2-R1;
 if (n>0)and(c>0)then
 begin
 Li:=2.41*a*exp((5/3)*ln(N))*ln(abs(8*a)/c);
 end;
По этой функции строим график. На графике ищем первую точку с координатами [R2,(abs(L-Li)<=e]. Если нужны обе точки, то прогоняем график отдельно на интервалах убывания и возрастания функции.
Вам надо поправить все ваши процедуры, продумать, что они делают, откуда берут данные, куда выдают.
Например что делают эти процедуры:
Код:
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
   L:=100;
   N:=4;
   R1:=1;
   if Radiobutton1.Checked = true then
   begin
   GoOut;
   end;
end;
Вы задаете параметры, а в процедуре GoOut, в состав которой входит процедура GrafOfFunc, эти параметры не используются.
Короче надо разбираться с программой, в чем я Вам не помощник, поскольку сам в Дельфи почти ноль.
Если помните, начинали мы с " Программа выдает ошибку "Invalid floating point operation"", тут я вам мог подсказать, а получилось как в поговорке "Дайте воды попить, а то так есть хочется, что переночевать негде".Это шутка.
Кроче посмотрите графики, таблицы, подумайте что и как поправить.
Вложения
Тип файла: rar Книга1.rar (44.7 Кб, 15 просмотров)
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь в создании программы... Gangster Общие вопросы Delphi 16 24.05.2008 14:42
нужна помощь - 2 программы в С++ Nemisoi Фриланс 1 22.04.2008 23:10
Нужна помощь в написании программы. GhosT3Ds Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2007 07:45