2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Метод Лобачевского
Сообщение14.03.2012, 15:56 


20/05/11
22
Попробовала реализовать метод Лобачевского для корней полиномов на Делфи.Не работает(((((((((((((((Помогите, пожалуйста, найти ошибку,уже не знаю на что и думать(
{$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 


20/05/11
22
Нашла ошибки, но считает все равно не верно(Помогите пожалуйста, очень надо!!!Курсач!(
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 
Заслуженный участник


09/09/10
3729

(Оффтоп)

Во-первых, надо голову отрывать тем, кто не может обрамить тегом 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 
Заслуженный участник


04/05/09
4587
Что интересно, power() тоже используется. ;-)
И зачем If в St()?

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

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

 Профиль  
                  
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 19:03 


24/05/09

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


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

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

 Профиль  
                  
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 19:29 
Заслуженный участник


09/09/10
3729
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 


24/05/09

2054
Joker_vD в сообщении #548686 писал(а):
Я понимаю, вы большой проект не писали и не поддерживали. И не дописывали.


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

 Профиль  
                  
 
 Re: Метод Лобачевского
Сообщение15.03.2012, 22:56 
Заслуженный участник


09/09/10
3729
Alexu007
Это ее "курсач", как она написала во втором сообщении. Мой руководитель требовал от меня чистых исходников. Впрочем, я-то писал библиотеку вкупе с фронт-эндом...

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

 Профиль  
                  
 
 Re: Метод Лобачевского
Сообщение17.03.2012, 11:42 


20/05/11
22
Спасибо за советы)Просто я сначала не смогла разобраться в методе и попыталась переделать код С++, который нашла в интернете(С++видела в первый раз, поэтому получилась фигня, просто сроки поджимали, хотелось поскорее). Теперь поняла, все получилось)Вот только про Button.Click...Если честно, то я всегда коды основные привязываю к кнопкам и мне никто не говорил, что это плохо)

 Профиль  
                  
 
 Re: Метод Лобачевского
Сообщение17.03.2012, 20:45 
Заслуженный участник


09/09/10
3729
А, уже разобрались. Ну здорово.

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group