Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Глюки... Ничего не понимаю в математике машин! Добавлено: 11.10.06 03:58  

Автор вопроса:  Morpheus | Web-сайт: xury.zx6.ru
Считал я как то интегралы на математике и выяснил к большому удивлению что мой инженерно-научный калькулятор (говорю с сарказмом) не может вычислить (-1)^(4/3) (степень была задана не так, а явно, дробью.)
Пишет - Не подходит к области определения функции (Domain Error)
Как это не подходит? ведь кубический корень из (-1)^4 должен неплохо вычисляться.
Ладно, захожу в наш любимый васик (а я кстати тоже давненько его недолюбливал за подобные глюки) и ввожу:

n = (-1) ^ (4 / 3)
выдаёт ошибку. при том что
n = ((-1) ^ 4) ^ (1 / 3)
решает правильно.

Просто я подумал что нет смысла звонить в техподдержку калькулятора и объяснять что у меня блин из-за вас интегралы не решаются раз даже ВБ не может решить...

Проосто хотелось бы знать в чём собственно причина таких вот странностей?

Ответить

  Ответы Всего ответов: 23  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 11.10.06 12:39
Да вообще гонево!
Кубический корень и из просто (-1) тоже вычисляется на ура - а он не может.
Мелкомягкий калькулятор вообще туфту гонит: (-1)^0.5 у него равно -1!!!

А как вообще вычисляются корни? Я-то их обычно подбором извлекаю (беру самое ближайшее извлекающееся число и накидываю разницу "на глазок";).
А какой у компа алгоритм?

Проосто хотелось бы знать в чём собственно причина таких вот странностей?

возможно если он видит в основании степени отрицательное число, то дробную степень даже и не пытается вычислить.

Ответить

Номер ответа: 2
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #2
Добавлено: 11.10.06 15:09
Да можно и через логорифмы, да зачем, если можно короче... в уме можно, но бывают же и не таки простые числа. просто на экзамене как бы нет времени даже на ((-1) ^ 4) ^ (1 / 3) - у меня калькулятор поддерживает формулу до 88 символов в таком формате (хотя пока не разу не переполнялся) так что может и не влезть :) Ладно, у отца возьму, его Шарп хоть и однострочный но держит до 160 символов :)

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 11.10.06 16:49
Дробные степени от отрицательных чисел, считается, нельзя вычислить, не выходя за границы действительных чисел. Потому что то же 4/3 = 8/6, а корни четных степеней из отрицательных чисел комплексны.

Ответить

Номер ответа: 4
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #4
Добавлено: 11.10.06 17:46
Ну и что? 2/1=4/2, но это не значит, что теперь и в квадрат отрицательные нельзя возводить...

Ответить

Номер ответа: 5
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #5
Добавлено: 11.10.06 21:58
aga... eto tochno!

Звонил в техподдержку... очень приятниые люди там сидят :) правда сказали что ета модель не поддерживает операции x^y где x<0 and y is not integer.
да их похоже ни один калкулатор не может вичислить.

2 Sharp: так что теперь и интеграл уже простенькии не посчитать? :(

Ответить

Номер ответа: 6
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #6
Добавлено: 11.10.06 22:01
p.s. (-1)^(4/3) = (-1)^(8/6) = sqr((-1)^8) = sqr(1) =1, where sqrt - корень 6-и цтепени.

Ответить

Номер ответа: 7
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #7
Добавлено: 11.10.06 22:35
1. sqr(1)=(+-)1
2. два хода решения:
(-1)^(5/3)=(-1)^(1/3)=-1
(-1)^(5/3)=(-1)^(10/6)=1^(1/6)=sqr(1)=(+-)1
по-моему умножать числитель и знаменатель степени это неправильно. :)

Ответить

Номер ответа: 8
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #8
Добавлено: 11.10.06 23:52
Если выход за множество действительных чисел происходит в зависимости от порядка действий или в случае эквивалентной операции хотя бы в одном случае, операция считается вообще невозможной на множестве действительных чисел.

Ответить

Номер ответа: 9
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #9
Добавлено: 12.10.06 02:12
sqr(1)=(+-)1

С каких пор +- ? :-)
на сколько я знаю это в уравнениях типа x^2=a мы имеем два решения и то, потому что ставим +- перед корнем :-\
да и вспомним хотя бы график...

Sharp, а как нам тогда посчитать интеграл функции x^1/3 (кубический корень из икс) на интервале [-2;-1]??? функция непрерывна на этом интервале и интеграл вычесляется по формуле

I = 3/4 * [ (-1)^4/3 - (-2)^4/3 ]

Ответить

Номер ответа: 10
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #10
Добавлено: 12.10.06 10:15
на сколько я знаю это в уравнениях типа x^2=a мы имеем два решения и то, потому что ставим +- перед корнем :-\

корни чётных степеней всегда имеют два решения - это очевидно.
да и вспомним хотя бы график...

и по графику тоже два решения

Если выход за множество действительных чисел происходит в зависимости от порядка действий или в случае эквивалентной операции хотя бы в одном случае, операция считается вообще невозможной на множестве действительных чисел.

Что за новости, таварисч? В математике порядок действий всегда жёстко определён.
Сначала выполняются действия в скобках - и собственно поэтому васик и не считает дроби - он делит 4 на 3, получает 1.333333333 (с точностью Double) а это десятичная (т.е. с чётным знаменателем) дробь - вот он и уходит в затык. Он не умеет раскрывать скобки - за него это должен делать прогер, поэтому если у вас есть дробь X/Y, то надо сначала возвести в X а потом в 1/Y.
Но!
MsgBox ((-1) ^ 4) ^ (1 / 3) - вычисляется правильно
MsgBox ((-1) ^ 5) ^ (1 / 3) - не вычисляется
Надо думать дальше...

Ответить

Номер ответа: 11
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #11
Добавлено: 12.10.06 14:29
Блин, забыл что корни то разные. Вобщем тут, в Канаде, юзают другой корень из которого выходит только одно решение и график соответственно представляет собой повёрнутую на -90 градусов левую ветку параболы. чтобы решить троблему, +- ставятся перед знаком конрня.

Ответить

Номер ответа: 12
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #12
Добавлено: 12.10.06 17:31
Sharp, а как нам тогда посчитать интеграл функции x^1/3 (кубический корень из икс) на интервале [-2;-1]??? функция непрерывна на этом интервале

Во-первых, попробуй построить график этой функции в Maple и посмотри, что думают по поводу ее непрерывности (и определенности) математики-создатели Maple.
Во-вторых, если так хочется, скажи, что эта функция нечетна и приравняй int(f(x), x=-2..-1) к -int(f(x), x=1..2) и все получится.
корни чётных степеней всегда имеют два решения - это очевидно.

Корень n-ой степени имеют n корней :))
Что за новости, таварисч? В математике порядок действий всегда жёстко определён.
Сначала выполняются действия в скобках - и собственно поэтому васик и не считает дроби

Не путай математику и языки программирования. 1/3 = 2/6? Равно. Значит и (-1)^(1/3) должно быть равно (-1)^(2/6), что должно быть равно sqr(-1)^6, а оно не определено на R.
Вобщем тут, в Канаде, юзают другой корень из которого выходит только одно решение

Многозначные функции, которой является множество решений x^2=a в случае квадратного корня, в нематематических вузах не рассматриваются.

Ответить

Номер ответа: 13
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #13
Добавлено: 12.10.06 18:42
Morpheus

А я говорил используй математические пакеты для рассчетов.:)

MsgBox ((-1) ^ 4) ^ (1 / 3) - вычисляется правильно
MsgBox ((-1) ^ 5) ^ (1 / 3) - не вычисляется


Все просто.
(-1) ^ 4) =1 положительное число.
(-1) ^ 5) =-1 отрицательное

Поэтому понятно почему так получается. Во втором случае дробная степень из отрицательного числа - результат комплексное число.

В .NET я не знаю есть нужный класс или нет (не нашел:)). Но в стандартной библиотеке С++ есть специальный класс - complex

#include "stdafx.h"
#include <complex>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
using namespace std;
   double po = 1.333;//4/3

   complex <double> cb1 ( -1 , 0);
   complex <double> ce1 = pow ( cb1 ,po );

   cout << "Complex number returned from complex base and power:"
        << "\n ce1 = cb1 ^ po = " << ce1 << endl;

// = -0.5+0.866i

po= 1.667;//5/3
   ce1 = pow ( cb1 ,po );

cout << "Complex number returned from complex base and power:"
        << "\n ce1 = cb1 ^ po = " << ce1 << endl;

// = 0.5+0.866i
  
 return 0;
}
Sharp

Не путай математику и языки программирования. 1/3 = 2/6? Равно. Значит и (-1)^(1/3) должно быть равно (-1)^(2/6), что должно быть равно sqr(-1)^6, а оно не определено на R.


Насчет не путать ты прав, но здесь немного поторопился.
(-1)^(2/6) не равно sqr(-1)^6. Тогда это получится (-1)^(6/2), что равняется -1^3.
Но смысл понятен.

Ответить

Номер ответа: 14
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 12.10.06 20:17
Упс, местами перепутал

Ответить

Номер ответа: 15
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #15
Добавлено: 12.10.06 20:51
Поэтому понятно почему так получается

Мне непонятно - степень-то нечётная.

Во втором случае дробная степень из отрицательного числа - результат комплексное число

корень кубический из (-1) комплексное число?

Но в стандартной библиотеке С++ есть специальный класс - complex

Ты скормил ему неверные данные и он выдал тебе неверный результат.
Результатом обоих выражений являются недействительные значения, хотя на самом деле это не так. Что является недействительным значением выражения - как пример значение y=sqr(x) при x=-1 - то значение, которого нет, т.е. которое нельзя указать на декартовых координатах. Его можно вычислить (как j), но не указать.
Итак берём палец ставим на ось абсцисс на значении (-1) и тянем до пересечения с графиком выражения (не функции!!!) - дотянули? а раз так, значит твоё решение неверно.
Про второе (y=x^(5/3)) вообще молчу - это функция, в ней по определению не может быть неопределённых значений.

Я же говорю задача правильного вычисления ложится на программера - бездумно использовать васика или те же пакеты, это как юзать каклькулятор (обычный) для вычисления (2+2*2). Иначе васик сделает из любой дроби дробь с чётным знаменателем и полезет в бутылку.

Вот написал функцию для вычисления кубического корня:

    Private Function MyPower1of3(ByVal x As Double) As Double
        Dim y As Double
        If x <> 0 Then ' с нулём глючило и я смухлевал :)
            Dim d, need_diff, r As Double
            Dim sig As Integer = 1
            Dim st As Double = 10
            need_diff = 0.0000000001
            d = 1
            y = 1
            Do While Math.Abs(d) > need_diff
                r = y * y * y
                d = x - r
                If Math.Sign(d) <> sig Then ' поворачиваем
                    st /= 2
                    If sig = -1 Then sig = 1 Else sig = -1
                End If
                y = y + sig * st
            Loop
        End If
        Return Math.Round(y, 8)
    End Function


И моя функция (даже в таком страшном виде) даёт правильные ответы:
MsgBox(MyPower1of3(-1) ^ 4)
MsgBox(MyPower1of3(-1) ^ 5)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам