Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нахождение коэффицента диффузии  (Прочитано 11756 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
ВИЛенин
Гость
« : 09-03-2010 04:20 » 

Расчёт коэффицента диффузии D
есть уравнения вида:
C1(x)=C0*erfc(x1/2sqrt(D*t1))
C2(x)=C0*erfc(x2/2sqrt(D*t2))

Алгоритм вычисления:
1.Задается время отжига и начальное значение С0 в первом цикле(к=1)
2.Ввод зависимости С(х) из n точек
3.Вычисления отношения Сn(x)/C0
4.Вычисление аргумента Z функции erfc(Z)=Cn/C0   (xn/2sqrt(D*t) = Z)
5.Dn = xn*xn/(4*t*Z*Z)
6.Вычисление среднего Dk = сумме по n (Dn / n)
7. |Dk - D(k-1)|<Dk/100
нет                                                                      да
k:=k+1                                                           конец программы
Co(k+1):= C1(x)/erfc(x1/2sqrt(Dk * t))

Вот код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math,
  ap, normaldistr;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit4: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Edit7: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Edit5: TEdit;
    Edit3: TEdit;
    Label4: TLabel;
    procedure Edit7MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
n=20;
var
  Form1: TForm1;
    k : integer;
//  no : integer;
  Co,t,Dks : real;
  dd,D,d1,d2 : real;
  C1,C2 : real;
  x1,x2 : real;
  z1,z2 : real;
//  i: integer;
  {Co,t,Dks : Extended;
  dd,D,d1,d2 : Extended;
  C1,C2 : Extended;
  x1,x2 : Extended;
  z1,z2 : Extended;}

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//Начальные данные       РАссматриваем вариант 2 точек!
  Co := StrToFloat(Edit1.Text);
  C1 := StrToFloat(Edit2.Text);
  x1 := StrToFloat(Edit4.Text);
  C2 := StrToFloat(Edit3.Text);
  x2 := StrToFloat(Edit5.Text);
  t := StrToFloat(Edit6.Text);
  k:=0;
 // no := StrToInt(Edit7.Text);


Dks:=0;
repeat
if Co=0 then
begin
     Label4.visible := true; break;
     Label4.Caption := 'Co обратилось в ноль! Плохо!';
end
else
begin
  //для каждого i считается считается Zi
z1:= 1/2*sqrt(Pi)*( C1/Co + Pi*Power(C1/Co,3)/12 + 7*Pi*Pi*Power(C1/Co,5)/480 +
127*Power(Pi,3)*Power(C1/Co,7)/40320 + 4369*Power(Pi,4)*Power(C1/Co,9)/5806080 +
34807*Power(Pi,5)*Power(C1/Co,11)/182476800 );

z2:= 1/2*sqrt(Pi)*( C2/Co + Pi*Power(C2/Co,3)/12 + 7*Pi*Pi*Power(C2/Co,5)/480 +
127*Power(Pi,3)*Power(C2/Co,7)/40320 + 4369*Power(Pi,4)*Power(C2/Co,9)/5806080 +
34807*Power(Pi,5)*Power(C2/Co,11)/182476800 );
end;

  // сумма по i . у меня оно равно 2.
  d1 := (x1*x1) / (4*t*z1*z1);
  d2 := (x2*x2) / (4*t*z2*z2);
  D:= (d1+d2)/2;   dd := sqrt(d1*d1+d2*d2)/2;

  if abs(D-Dks) < D/100 then
    begin//конец программы:)
      break;
    end
  else
    begin
     k:=k+1;
     Dks:=D;
     Co:= C1/erfc(x1 / (2 * sqrt(t*d)));
    end;

until k=20000;

  Label4.Caption := FloatToStr(Co); label12.Caption := FloatToStr(D);
  label13.Caption := FloatToStr(dd); label14.Caption := IntToStr(K);

  label8.Visible:=true; label9.Visible:=true; label10.Visible:=true; label11.Visible:=true;
  label12.Visible:=true; label13.Visible:=true; label14.Visible:=true; label4.Visible:=true;

end;

procedure TForm1.Edit7MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Edit7.Text := ' ';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

    Edit7.visible := false;

  Edit1.Text := FloatToStr(33);   //Co
  Edit2.Text := FloatToStr(16.3); //C1
  Edit3.Text := FloatToStr(8.5);  //C2
  Edit4.Text := FloatToStr(0.4);  //X1
  Edit5.Text := FloatToStr(0.8);  //X2
  Edit6.Text := IntToStr(334800); //t

end;

end.

на всякий случай что такое erfc : http://ru.wikipedia.org/wiki/Функция_ошибок
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 09-03-2010 04:24 » 

а в чём заключается вопрос ? Улыбаюсь
Записан

ВИЛенин
Гость
« Ответ #2 : 09-03-2010 04:28 » 

вопрос только в том, что это программа неправильно работает:(
Так как есть программа на Бейсике и её результаты не совпадают с моими

Не могу понять, почему!
« Последнее редактирование: 09-03-2010 04:34 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 09-03-2010 04:29 » 

ВИЛенин, может такое быть, что в программе на Бейсике ошибка. Или у тебя )

Ты в отладчике всё по шагам детально проверил ?
Записан

ВИЛенин
Гость
« Ответ #4 : 09-03-2010 04:40 » 

Бейсик не моя программа. Но она работает правильно. Отладчиком проверял, но ничего не нашёл плохого.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 09-03-2010 04:48 » 

ВИЛенин, ну, что тут сделаешь, только ещё раз внимательно изучить программу

а на бумаге по формулам считал ? Сходится с контрольным примером из бейсика ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 09-03-2010 04:49 » 

ВИЛенин, стоит еще раз сравнить реализацию алгоритма. В частности, типы переменных, их инициализацию. Сперва убедись, что реализовал точно так же и ни у тебя, ни у того бейсика ошибок нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ВИЛенин
Гость
« Ответ #7 : 09-03-2010 04:54 » 

Эх не хотелось этого делать(чувствую большую рутинную и почти не нужную работу) Но похоже придётся
Записан
ВИЛенин
Гость
« Ответ #8 : 09-03-2010 04:57 » 

и основаная проблема будет в том что промежуточных значений в Бейсике я не узнаю. Только окончательный ответ
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 09-03-2010 05:00 » 

ВИЛенин, ты, конечно же, не читал правила при регистрации. Напоминаю: дублировать темы запрещено.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 09-03-2010 05:04 » 

Эх не хотелось этого делать
а придётся ) Дело даже не в рутине, а в поведении переменных и операторов в программе.  Если на бумаге конечный результат правильный, в в программе по этим же формулам - нет, то ответ один: ошибка в программе. Где-то что-то не учтено, теряется точность и тд

Промежуточные значения из бейсика не нужны, а вот на бумаге они есть Улыбаюсь
Записан

ВИЛенин
Гость
« Ответ #11 : 09-03-2010 05:05 » 

RXL извини больше не буду!
Записан
ВИЛенин
Гость
« Ответ #12 : 09-03-2010 05:10 » 

я чего не уловил...промежуточные результаты на бумаге есть откуда??? у меня на бумаге только начальные данные
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 09-03-2010 05:13 » 

ВИЛенин, ты же по формулам считать будешь - считай так, как считал бы в программе. Вот откуда возьмутся промежуточные данные для проверки. Потом в отладчике шагай и сравнивай, где начинается расхождение. Там будем разбираться дальше
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines