F(X)=0, метод решения систем нелинейных уравнений

Форум для обсуждения вопросов математики

Модератор: Admin

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Вс окт 07, 2012 8:09 pm

Ребус - это неотформатированное месиво из команд maple в ваших листингах :), а это ещё куда ни шло.

В общем, p(T) - это искомая функция в виде десятки с показателем степени b[1] + b[2]/T + b[3] * log10(T). Даны 10 точек экспериментальных данных (насколько они реальны я не спрашивал). Эти самые точки, соединённые линией, изображены на картинке. Нужно по этим 10 точкам восстановить коэффициенты b[] в функции p(T). В обозначениях выше я её более обще называл просто f(x,a) она же f(T,b). Почему именно такая форма функции я не спрашивал.

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

Вольт-амперные характеристики (ВАХ) диода тоже имеют показательный характер, но там делают просто - аппроксимируют ломанной, не мудрствуя лукаво. Вообще, в справочных данных электронных приборов много нелинейностей, как, наверное и во многих других инженерных областях.

genfit() наверное справилась бы, надо будет попробовать.

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Вс окт 07, 2012 9:52 pm

s
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:36 am, всего редактировалось 1 раз.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Вс окт 07, 2012 10:08 pm

Решения вот такие:
Изображение

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Вс окт 07, 2012 10:19 pm

w
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:36 am, всего редактировалось 1 раз.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Вс окт 07, 2012 10:23 pm

T - те же самые, там 273 справа прибавлено к вектору.

Изображение

Код: Выделить всё

with(Statistics):
T := Vector( [ 236.3, 253.4, 261.5, 270.4, 280.6, 288.4, 299.1, 315.2, 333.6, 353.1 ], datatype = float ):
p := Vector( [ 1, 5, 10, 20, 40, 60, 100, 200, 400, 760 ], datatype = float ):
Fit( 10^( b1 + b2 / t + b3 * log10(t) ), T, p, t );

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Вс окт 07, 2012 10:34 pm

l
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:36 am, всего редактировалось 1 раз.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Вс окт 07, 2012 10:50 pm

Вот так надо:

Код: Выделить всё

r[i] - 10 ^( x1 + x2/T[i] + x3^log[10]( T[i] ) )


Или прологарифмировать заданные r[i]. Видимо тогда всё гораздо упростится. Как это мне раньше в голову не пришло.

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Пн окт 08, 2012 10:15 am

s
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:37 am, всего редактировалось 1 раз.

Korobov V I
Сообщения: 1609
Зарегистрирован: Вт янв 21, 2003 5:12 pm

Сообщение Korobov V I » Пн окт 08, 2012 11:20 am

uni писал(а):Мне показали вот такие данные:
Изображение

Логарифмирование действительно упрощает задачу. Во всяком случае в "классическом" Mathcad оно позволяет применить функцию linfit.
Изображение

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Пн окт 08, 2012 11:27 am

Алексей Борисович, этот знак появился у вас, ко мне какие вопросы? Я лишь скопировал ваш пример и показал, что вы не правильно переписали.
Жду указания на ошибки…

Вот я и указал.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Пн окт 08, 2012 12:34 pm

Логарифмирование действительно упрощает задачу. Во всяком случае в "классическом" Mathcad оно позволяет применить функцию linfit.


Задача упрощается, но точность не повышается

Изображение

Код: Выделить всё

with(Statistics):
T := Vector( [ 236.3, 253.4, 261.5, 270.4, 280.6, 288.4, 299.1, 315.2, 333.6, 353.1 ], datatype = float ):
p := ( Vector( evalf( map( log10, [ 1, 5, 10, 20, 40, 60, 100, 200, 400, 760 ] ) ), datatype = float ) ):
Fit( b1 + b2 / t + b3 * log10(t), T, p, t, output = parametervalues );

add( ( 10 ^ ( 78.0123580680084530 + ( -5018.62528907199521 ) / T[k] + ( -23.9182564800930636 ) * log10( T[k] ) ) - 10^p[k] ) ^2, k = 1..10 );

T := Vector( [ 236.3, 253.4, 261.5, 270.4, 280.6, 288.4, 299.1, 315.2, 333.6, 353.1 ], datatype = float ):
p := Vector( [ 1, 5, 10, 20, 40, 60, 100, 200, 400, 760 ], datatype = float ):
Fit( 10^( b1 + b2 / t + b3 * log10(t) ), T, p, t, output = parametervalues );

add( ( 10^( 28.4502559095434933 + ( -2720.12633981294994 ) / T[k] + ( -7.01208324395984839 ) * log10( T[k] ) ) - p[k] ) ^2, k = 1..10 );

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Пн окт 08, 2012 1:52 pm

s
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:37 am, всего редактировалось 1 раз.

uni
Сообщения: 1817
Зарегистрирован: Сб ноя 13, 2004 3:06 pm
Откуда: п.г.т. Излучинск
Контактная информация:

Сообщение uni » Пн окт 08, 2012 2:24 pm

Нет, Алексей Борисович, увы, это не подходит как точное решение исходной постановки задачи как минимума суммы квадратов.

Желательно бы получить более точное решение:

Код: Выделить всё

b1 = 28.4502559095434933;
b2 = -2720.12633981294994;
b3 = -7.01208324395984839.


С ними сумма квадратов разностей равна: ~= 20,9.

Как я уже говорил, получающиеся выражения вводят мою реализацию решателя по методу в ступор. Видимо нужно под микроскопом посмотреть что не так.

алексей_алексей
Сообщения: 1776
Зарегистрирован: Вс май 01, 2005 9:02 pm

Сообщение алексей_алексей » Пн окт 08, 2012 2:36 pm

s
Последний раз редактировалось алексей_алексей Пт июн 17, 2016 9:37 am, всего редактировалось 1 раз.

Korobov V I
Сообщения: 1609
Зарегистрирован: Вт янв 21, 2003 5:12 pm

Сообщение Korobov V I » Пн окт 08, 2012 2:38 pm

uni писал(а):Нет, Алексей Борисович, увы, это не подходит как точное решение исходной постановки задачи как минимума суммы квадратов.

Желательно бы получить более точное решение:

Код: Выделить всё

b1 = 28.4502559095434933;
b2 = -2720.12633981294994;
b3 = -7.01208324395984839.


С ними сумма квадратов разностей равна: ~= 20,9.

Как я уже говорил, получающиеся выражения вводят мою реализацию решателя по методу в ступор. Видимо нужно под микроскопом посмотреть что не так.

Вы определитесь, господа, что Вы понимаете под точностью. Вы хотите найти значения параметров, при котором сумма отклонений минимальна? И чем она "минимальней", тем лучше?
Вы же обрабатываете массив экспериментвльных данных.
Не надо ловить кучу знаков после запятой, когда речь идет об оценке параметров аппроксимации. При доверительной вероятности 95% (величина, наиболее употребительная при анализе экспериментальных данных), доверительные интервалы довольно широкие.
Изображение