Новичок
Джуниор
Регистрация: 13.10.2019
Сообщений: 1
При подсчёте значений ошибка log:SING error
Добрый вечер. Столкнулся с такой проблемой, что после ввода значений программа выдаёт ошибку log:SING error раз 10 подряд, а после выводит полученные результаты на экран. В таблице часто встречаются нули, хотя я не уверен, что они должны получаться в ходе работы программы. Сама программа работает корректно, поскольку я подставлял в неё другую функцию без логарифма и всё правильно считалось. Так что дело явно в логарифме. Знаю, что эта ошибка вылезает, когда логарифм пытается считать значение от 0. Прописал условия, чтобы этого не происходило, однако, не помогло. Возможно какого-то условия не хватает, или в программе что-то не так. Прощу помочь решить эту проблему. Ниже код и скрин поля для ввода значений. Выводные значения: интеграл, количество итераций и таблица.
Код:
//---------------------------------------
------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include <cmath>
#include "Unit1.h"
//---------------------------------------
------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------
------------------------------------
double F(double);
void Sim
(double,double,double,int,int&,double&,in
t&);
void Tab
(double,double,double,int,int,double&,dou
ble*,double*,double**,double**);
void RezOut
(int,int,double&,int&,double*,double*,dou
ble**,double**);
//---------------------------------------
------------------------------------
__fastcall TForm1::TForm1(TComponent*
Owner)
: TForm(Owner)
{
}
//---------------------------------------
------------------------------------
void __fastcall TForm1::Button1Click
(TObject *Sender)
{
double C,D,Eps,Xn,Xk,Dx,B;
int Km,Er,M,LS;
Xn=StrToFloat(Form1->Edit1->Text);
Xk=StrToFloat(Form1->Edit2->Text);
Dx=StrToFloat(Form1->Edit3->Text);
C=StrToFloat(Form1->Edit4->Text);
D=StrToFloat(Form1->Edit5->Text);
Eps=StrToFloat(Form1->Edit6->Text);
Km=StrToFloat(Form1->Edit7->Text);
M=StrToFloat(Form1->Edit8->Text);
int N=(int)((Xk-Xn)/Dx)+1;
double *Mx=new double[N];
double *Ma=new double[M];
double **Mf=new double*[M];
for(int i=0;i<M;i++)
Mf[i]=new double[N];
double **Err=new double*[M];
for(int i=0;i<M;i++)
Err[i]=new double[N];
if((Eps>0)&&(Eps<1))
{
Sim(C,D,Eps,Km,LS,B,Er);
if(Er==1)
{
ShowMessage("Интеграл не найдет за
"+IntToStr(Km)+" итераций");
}
else
{
Tab(Xn,Xk,Dx,N,M,B,Mx,Ma,Mf,Err);
RezOut(N,M,B,LS,Mx,Ma,Mf,Err);
}
}
else
{
ShowMessage("Погрешность должна быть
больше 0 и меньше 1");
}
delete[]Mx;
delete[]Ma;
for(int i=0;i<M;i++)
delete[]Mf[i];
delete[]Mf;
for(int i=0;i<M;i++)
delete[]Err[i];
delete[]Err;
}
//---------------------------------------
------------------------------------
void __fastcall TForm1::Button2Click
(TObject *Sender)
{
Form1->Edit1->Clear();
Form1->Edit2->Clear();
Form1->Edit3->Clear();
Form1->Edit4->Clear();
Form1->Edit5->Clear();
Form1->Edit6->Clear();
Form1->Edit7->Clear();
Form1->Edit8->Clear();
Form1->Edit9->Clear();
Form1->Edit10->Clear();
for(int i=0;i<=Form1->StringGrid1-
>RowCount;i++)
{
Form1->StringGrid1->Rows[i]->Clear();
}
}
//---------------------------------------
------------------------------------
void __fastcall TForm1::Button3Click
(TObject *Sender)
{
Close();
}
//---------------------------------------
------------------------------------
double F(double X)
{
double F=exp(X)*cos(X*X);
return F;
}
//---------------------------------------
------------------------------------
void Sim(double C,double D,double Eps,int
Km,int &LS,double &B,int &Er)
{
double Int,Y1,Yn,S4,S2,H,Del,Loc,X;
int I,J,K2;
Er=1;
LS=0;
Int=0;
Y1=F(C);
Yn=F(D);
K2=2;
J=1;
while(J<=Km)
{
H=(D-C)/K2;
B=0;
S2=0;
S4=0;
I=1;
X=C+H;
do {
if((I%2)!=0)
{
S4=S4+F(X);
}
else
{
S2=S2+F(X);
Loc=4*S4+2*S2;
}
I=I+1;
X=X+H;
}
while(I<K2);
B=H*(Y1+Yn+Loc)/3;
Del=fabs(Int-B);
if(Del<Eps)
{
Er=0;
LS=J;
J=Km;
}
else
{
Int=B;
K2=K2*2;
}
J=J+1;
}
}
//---------------------------------------
------------------------------------
void Tab(double Xn,double Xk,double
Dx,int N,int M,double
&B,double*Mx,double*Ma,double**Mf,double*
*Err)
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
Mx[j]=Xn+Dx*j;
if ((log(Ma[i]*Mx[j])!=0) && (Ma[i]
*Mx[j]!=0) && (Ma[i]*Mx[j]!=1) && (Ma
[i]!=0) && (Ma[i]!=1) && (Mx[j]!=0) &&
(Mx[j]!=1))
{
Mf[i][j]=(Mx[j]*(cos(M_PI*Mx[j])-
3*B*sin(2*Mx[j])))/log(Ma[i]*Mx[j]);
Err[i][j]=0;
}
else Err[i][j]=1;
}
}
}
//---------------------------------------
------------------------------------
void RezOut(int N,int M,double &B,int
&LS,double *Mx,double *Ma,double
**Mf,double**Err)
{
Form1->Edit9->Text=FloatToStr(B);
Form1->Edit10->Text=IntToStr(LS);
Form1->StringGrid1->RowCount=N+1;
Form1->StringGrid1->ColCount=M+1;
Form1->StringGrid1->Cells[0][0]="X/A";
for(int i=0;i<M;i++)
{
Form1->StringGrid1->Cells[i+1][0]="A
["+IntToStr(i)+"]="+FloatToStr(Ma[i]);
for(int j=0;j<N;j++)
{
Form1->StringGrid1->Cells[0][j+1]="X
["+IntToStr(j)+"]="+FloatToStr(Mx[j]);
if(Err[i][j]==1)
Form1->StringGrid1->Cells[i+1][j+1]
="Err";
else
Form1->StringGrid1->Cells[i+1][j+1]
=FloatToStr(Mf[i][j]);
}
}
}
//---------------------------------------
------------------------------------
Изображения
1.PNG (18.3 Кб, 63 просмотров)