Форум: "Прочее";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
ВнизКак решить уравнение(если можно)? Найти похожие ветки
← →
Кое кто (2009-03-17 19:01) [0]x^x = a
← →
тимохов © (2009-03-17 19:03) [1]методом герона
← →
Кое кто (2009-03-17 19:04) [2]тимохов ©
А поточнее можно, я уже испробовал многое...
← →
тимохов © (2009-03-17 19:04) [3]Вот он
http://ru.wikipedia.org/wiki/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D0%B0_%D0%93%D0%B5%D1%80%D0%BE%D0%BD%D0%B0
← →
тимохов © (2009-03-17 19:06) [4]в принципе в виках описан алгорим для любой степени.
главное сходится быстро. но нужно начальное приближение. :)
← →
тимохов © (2009-03-17 19:06) [5]а... блин, :) это x в степени x
а я подумал, что помножить
не пойдет :)
← →
Кое кто (2009-03-17 19:14) [6]Я пока что думаю, преобразовать его в ln x = ln a (1/x)... А дальше нужно найти пересечение графиков, обвести квадратом эту области и устремить сторону квадрата к нулю, тогда по идеи, мы найдем точку, ну как это математизировать??
← →
Игорь Шевченко © (2009-03-17 19:31) [7]с английским у тебя проблемы уже закончились ?
← →
DillerXX © (2009-03-18 00:04) [8]Вижу 2 способа:
1) Метод Ньютона
2) Бинарный поиск
Помидорами не кидать.
← →
DillerXX © (2009-03-19 02:56) [9]Какого-то хрена, в 2.10 ночи меня дёрнуло написать код этой задачи методом Ньютона :( В результате промучался проблемой начального приближения, но десятичный логарифм оказался кстати. Так вот, сразу выяснил, что программа работает для любых чисел в диапазоне 1..10^30 (и больше), а вот в интервале (0..1) не для всех. Методом мартышки выяснил, что для всех чисел меньших числа 0.6922006275554 x рано или поздно вылетает в x < 0, и на очередной итерации получается бесконечность. С мыслью, а не это ли число искали в "автостопом по галактике", пойду спать.
Вот код, хотя автору вряд ли уже нужно.
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
double EPS = 1E-13;
int main()
{
freopen("input.txt", "rt", stdin);
freopen("output.txt", "wt", stdout);
double a, x0, x1;
cin >> a;
int iters = 0;
x0 = log10(a) + 1;
for (;;)
{
x1 = x0 - ((pow(x0, x0) - a) / ((log(x0) + 1) * pow(x0, x0)));
if (abs(x1 - x0) < EPS)
break;
++iters;
x0 = x1;
if (iters > 1000000)
{
puts("Oh f*ck :(");
break;
}
}
printf("Iteration: %d\nanswer: %.15f", iters, x0);
}
← →
Eraser © (2009-03-19 03:43) [10]> Как решить уравнение(если можно)?
в среднюю школу запишись.
← →
Дуб © (2009-03-19 05:50) [11]> а вот в интервале (0..1) не для всех
И это понятно, достаточно начертить график. Лучше хордами там.
← →
Дуб © (2009-03-19 05:57) [12]
> Методом мартышки выяснил, что для всех чисел меньших числа
> 0.6922006275554 x рано или поздно вылетает
Методом научного анализа устанавливается, что для чисел меньше 0,692200628 = (1/e)^(1/e) уравнение не имеет решения в положительном действительном диапазоне. В интервале же от этого до 1(не включая 1) имеет по 2 решения.
← →
DillerXX © (2009-03-19 09:32) [13]
> Методом научного анализа устанавливается, что для чисел
> меньше 0,692200628 = (1/e)^(1/e) уравнение не имеет решения
> в положительном действительном диапазоне. В интервале же
> от этого до 1(не включая 1) имеет по 2 решения.
Спасибо что объяснили! А есть способы не-численного решения, или более быстро-сходящиеся способы?
← →
Дуб © (2009-03-19 11:19) [14]>DillerXX © (19.03.09 09:32) [13]
В квадратурах скорее всего не существует решения. Но, по хорошему, это доказать надо.
Сходимость хорошая, вычисления не сложные - ускорять смысла нет. Про хорды - это от начального приближения зависит. Для правой части больше 1 начально приближение - любое больше 1. Для меньших одно решение - начальное любое больше 1/е. И тут в обоих случаях сработает Ньютон.
Для второго же решения для меньших 1 - я бы хорды взял. Начальное приближение интервал [0,1/e]. Функцию x^x в 0 замыкаем на 1 и вперед.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c