2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Метод Лобачевского
Сообщение14.03.2012, 15:56 
Попробовала реализовать метод Лобачевского для корней полиномов на Делфи.Не работает(((((((((((((((Помогите, пожалуйста, найти ошибку,уже не знаю на что и думать(
{$R *.dfm}
Function St(Value,Degree:Real):Real;
Begin
If Degree > 0 Then
St:=Exp(Degree*Ln(Value))
Else
St:=1/(Exp(Degree*Ln(Value)));
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
j,s,k,i,n,step,izo:Integer;
summ,akms,akps,b:Real;
Aa,A,x:Array[0..1000] Of Real;
Begin
Step:=StrtoInt(Edit1.Text);
n:=step + 1;
For i:=0 To Step Do
Aa[i]:=StrtoFloat(StringGrid1.Cells[0,i]);
j:=2;
While j <= 128 Do
Begin
For k:=0 To Step Do
Summ:=0;
For s:=1 To k Do
Begin
If ((k-s)<0) Or ((k-s)>step) Then
akms:=0
Else
akms:=Aa[k-s];
If((k+s)<0) Or ((k+s)>step) Then
akps:=0
Else
akps:=Aa[k+s];
summ:=summ+St(-1,s)*akms*akps;
End;
j:=j*2;
End;
A[k]:=Aa[k]*Aa[k]+2*summ;
For i:=0 To Step Do
Aa[i]:=A[i];
b:=1/128;
for i:=0 To step Do
x[i]:=St((Aa[i+1]/Aa[i]),b);
for i:=0 To step Do
Begin
izo:=i+1;
Label1.Caption:=Label1.Caption+'X'+inttoStr(izo)+'='+FloattoStr(x[i])+#13;
End;
Label1.CAption:=Label1.Caption+'Подставьте корни в исходное уравнение, меняя знаки корней на противоположные, если они не обращают его в тождество';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='2'; StringGrid1.Cells[1,0]:='3'; StringGrid1.Cells[2,0]:='2'; StringGrid1.Cells[3,0]:='-4'; StringGrid1.Cells[4,0]:='-5';
end;

 
 
 
 Re: Метод Лобачевского
Сообщение14.03.2012, 21:42 
Нашла ошибки, но считает все равно не верно(Помогите пожалуйста, очень надо!!!Курсач!(
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Button2: TButton;
StringGrid1: TStringGrid;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
{Function St(Value,Degree:Real):Real;
Begin
If Degree > 0 Then
St:=Exp(Degree*Ln(Value))
Else
St:=1/(Exp(Degree*Ln(Value)));
End; }

procedure TForm1.Button1Click(Sender: TObject);
Var
j,s,k,i,n,step,izo:Integer;
summ,akms,akps,b,hui:Real;
Aa,A,x:Array[0..1000] Of Real;
Begin
Step:=StrtoInt(Edit1.Text);
n:=step + 1;
For i:=0 To Step Do
Aa[i]:=StrtoFloat(StringGrid1.Cells[i,0]);
j:=2;
While j <= 128 Do
Begin
For k:=0 To Step Do begin
Summ:=0;
For s:=1 To k Do
Begin
If ((k-s)<0) Or ((k-s)>step) Then
akms:=0
Else
akms:=Aa[k-s];
If((k+s)<0) Or ((k+s)>step) Then
akps:=0
Else
akps:=Aa[k+s];
summ:=summ+power(-1,s)*akms*akps;
End;
j:=j*2;

A[k]:=Aa[k]*Aa[k]+2*summ;
end;
For i:=0 To Step Do
Aa[i]:=A[i];
end;



b:=1/128;

for i:=0 To step Do begin
hui:= Aa[i+1]/Aa[i];
x[i]:=power(hui,b);
end;

for i:=0 To step Do
Begin
izo:=i+1;
Label3.Caption:=Label3.Caption+'X'+inttoStr(izo)+'='+FloattoStr(x[i])+#13;
End;
Label3.CAption:=Label3.Caption+'Ïîäñòàâüòå êîðíè â èñõîäíîå óðàâíåíèå, ìåíÿÿ çíàêè êîðíåé íà ïðîòèâîïîëîæíûå, åñëè îíè íå îáðàùàþò åãî â òîæäåñòâî';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='1'; StringGrid1.Cells[1,0]:='1'; StringGrid1.Cells[2,0]:='1'; StringGrid1.Cells[3,0]:='1'; StringGrid1.Cells[4,0]:='-4';
end;

end.

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 13:25 

(Оффтоп)

Во-первых, надо голову отрывать тем, кто не может обрамить тегом syntax свой код. Во-вторых, голову надо отрывать тем, кто все пишет в Button1Click, а вывод через "Label3.Caption :=". Спасибо, что вы хоть "Form1.Label3.Caption" не написали. В-третьих, голову надо отрывать за такое форматирование.

За написание заново стандартных функций с использованием нижегородского английского вообще убивать стоит на месте:
Используется синтаксис Delphi
Function St&#40;Value,Degree:Real&#41;:Real;
Begin
  If Degree > 0 Then
  St:=Exp&#40;Degree*Ln&#40;Value&#41;&#41;
  Else
  St:=1/&#40;Exp&#40;Degree*Ln&#40;Value&#41;&#41;&#41;;
End;

Это типа $Value^{Degree}$? А чем вас Power не устроил? А переменная с именем "hui"?

Короче, приведите это в читаемый вид, тогда и будем разбираться.

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 17:50 
Что интересно, power() тоже используется. ;-)
И зачем If в St()?

-- Чт мар 15, 2012 09:54:01 --

О! Кстати, St() (да и Power(), наверное) не работает с отрицательным первым аргументом (логарифм не определён). А в степень возводится как раз -1. Возможно, это и есть главная проблема. Возведить -1 в целую степень надо особым способом.

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 19:03 
Joker_vD в сообщении #548549 писал(а):
Во-вторых, голову надо отрывать тем, кто все пишет в Button1Click, а вывод через "Label3.Caption :=".


А в С++ builder и наверняка в delfi весь код пишется в обработчиках кнопок, а "между" обработчиками код не предусмотрен. Не, ну можно конечно всё оформить в виде функции, а в обработчике вызывать только эту функцию. Но это по большому счёту будет шило на мыло, потому что Button1Click тоже функция. И даже "понятности" кода не добавит. Вот комменарии бы не помешали, что-бы не разгадывать чужие ребусы.

А вывод через что? Printf не работает. "Label3.Caption :=" как раз для вывода различной информации и придуман.

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 19:29 
Alexu007 в сообщении #548670 писал(а):
а "между" обработчиками код не предусмотрен.

Где это вы такую чушь разыскали?

Alexu007 в сообщении #548670 писал(а):
Но это по большому счёту будет шило на мыло, потому что Button1Click тоже функция. И даже "понятности" кода не добавит.

Alexu007 в сообщении #548670 писал(а):
А вывод через что? Printf не работает. "Label3.Caption :=" как раз для вывода различной информации и придуман.

Я понимаю, вы большой проект не писали и не поддерживали. И не дописывали. Ладно. Но зачем же вы с безаппеляционным тоном учите молодежь дурному, когда чуть ли не во всех учебниках, у которых доходят руки до собственно, do's and do-not's, говорят: "НЕ ПИХАЙТЕ ВЕСЬ КОД В ВОЛШЕБНУЮ КНОПКУ". Интерфейс должен быть отвязан от функциональности, это азбучная истина.

Button1Click — это обработчик. По-хорошему, там весь код должен быть по принципу "отразить действия пользователя/вызвать затребованную функциональность/отразить результат". Причем в больших проектах себя оправдывает отвязка от обработчиков не только полезной функциональности, но и отвязка вывода информации на экран.

venco
function Power(Base, Exponent: Extended): Extended;
"Power raises Base to any power. For fractional exponents or exponents greater than MaxInt, Base must be greater than 0."

function IntPower(Base: Extended; Exponent: Integer): Extended register;
"IntPower raises Base to the power specified by Exponent."

Но читать документацию — ниже достоинства многих программистов... а уж подумать — не жирно ли это возводить, $-1$ в целую степень с помощью процедуры...

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 20:28 
Joker_vD в сообщении #548686 писал(а):
Я понимаю, вы большой проект не писали и не поддерживали. И не дописывали.


Вот именно. А для маленького проекта, коим скорее всего и является код Natalya23, вполне сойдёт и так. К тому же вполне возможно, что весь этот маленький проект - тестовая оболочка для отладки единственной функции. Стоит ли подготовительные работы к постройке собачьей конуры делать с такой же тщательностью, как к постройке двухэтажного особняка?

 
 
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 22:56 
Alexu007
Это ее "курсач", как она написала во втором сообщении. Мой руководитель требовал от меня чистых исходников. Впрочем, я-то писал библиотеку вкупе с фронт-эндом...

Natalya23
Правда, приведите код в читаемый вид. Сейчас все, что я могу понять — там многочлен умножается на себя же изуродованного, и так много-много раз... видимо, конце-концов у получившегося многочлена будет один очень большой и очевидный корень, являющийся возведенным в 128-ую степень корнем исходного многочлена. Это и есть хитрый план? Смахивает на вычисление собственного числа матрицы прямым методом :-)

 
 
 
 Re: Метод Лобачевского
Сообщение17.03.2012, 11:42 
Спасибо за советы)Просто я сначала не смогла разобраться в методе и попыталась переделать код С++, который нашла в интернете(С++видела в первый раз, поэтому получилась фигня, просто сроки поджимали, хотелось поскорее). Теперь поняла, все получилось)Вот только про Button.Click...Если честно, то я всегда коды основные привязываю к кнопкам и мне никто не говорил, что это плохо)

 
 
 
 Re: Метод Лобачевского
Сообщение17.03.2012, 20:45 
А, уже разобрались. Ну здорово.

Natalya23 в сообщении #549267 писал(а):
Вот только про Button.Click...Если честно, то я всегда коды основные привязываю к кнопкам и мне никто не говорил, что это плохо)

Теперь вам это сказали и вы это знаете. Вот подробнее, почему так делать не надо: 98/97: Отделяйте интерфейс пользователя от кода

 
 
 [ Сообщений: 10 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group