Nano Hash - криптовалюты, майнинг, программирование

Попытка найти точку, когда две функции отличаются друг от друга на 5% с помощью Matlab

Как я написал в заголовке, я пытаюсь найти точное расстояние (в данном случае безразмерное расстояние), когда две функции начинают отличаться друг от друга на 5% по оси Y. Две функции пересекаются при значении 1 по оси X, и мне нужно найти описанное расстояние до пересечения, а не после (т. е. оно должно быть меньше 1). Я написал код Matlab, чтобы вы могли увидеть форму функций и следующие вычисления, которые я пытаюсь заставить их работать, но они не работают, я не знаю, почему. "Явное решение не найдено".

Не знаю, понятно ли я объяснил. Пожалуйста, дайте мне знать, если вам нужно более подробное объяснение.

Я надеюсь, что вы можете пролить свет на этот вопрос.

Большое спасибо заранее.

r=0:0.001:1.2;
ro=0.335;
rt=r./ro;
De=0.3534;
k=2.8552;
B=(2*k/De)^0.5;
Fm=2.*De.*B.*ro.*[1-exp(B.*ro.*(1-rt))].*exp(B.*ro.*(1-rt));
A=5;
b=2.2347;
C=167.4692;
Ftt=(C.*(exp(-b.*rt).*((b.^6.*rt.^5)./120 + (b.^5.*rt.^4)./24 + (b.^4.*rt.^3)./6 +         (b.^3.*rt.^2)./2 + b.^2.*rt + b) - b.*exp(-b.*rt).*((b.^6.*rt.^6)./720 + (b.^5.*rt.^5)./120 + (b.^4.*rt.^4)./24 + (b.^3.*rt.^3)./6 + (b.^2.*rt.^2)./2 + b.*rt + 1)))./rt.^6 - (6.*C.*(exp(-b.*rt).*((b.^6.*rt.^6)./720 + (b.^5.*rt.^5)./120 + (b.^4.*rt.^4)./24 + (b.^3.*rt.^3)./6 + (b.^2.*rt.^2)./2 + b.*rt + 1) - 1))./rt.^7 - A.*b.*exp(-b.*rt);
plot(rt,-Fm,'red')
axis([0 2 -1 3])
xlabel('Dimensionless distance')
ylabel('Force, -dU/dr')
hold on
plot(rt,-Ftt,'green')
clear rt
syms rt
%assume(0<rt<1)
r1=solve((Fm-Ftt)/Ftt==0.05,rt)
r2=solve((Ftt-Fm)/Fm==0.05,rt)

Ответы:


1

Добро пожаловать в суть данных с плавающей запятой. Причина в том, что для значений r, которые вы предоставляете, точное решение 0.05 может быть между двумя значениями в вашем массиве r, поэтому вы не сможете получить точное решение. Кроме того, FWIW, ваше уравнение может никогда генерировать решение 0,05, поэтому вы также получаете эту ошибку. В любом случае никогда не рекомендуется выполнять это явное решение для данных с плавающей запятой, если вы не очень хорошо знаете, как формируются ваши данные и какие значения вы ожидаете для вывода функции, к которой вы применяете данные.

Поэтому всегда рекомендуется находить ближайшее значение, удовлетворяющее вашему условию. Таким образом, вы должны сделать что-то вроде этого:

[~,ind] = min(abs((Fm-Ftt)./Ftt - 0.05)); 
r1 = r(ind);

Первая строка найдет ближайшее местоположение в вашем массиве r, которое удовлетворяет критерию 5%. Следующая строка кода даст вам значение, которое находится в вашем массиве r, которое удовлетворяет этому. Вы можете сделать то же самое с r2:

[~,ind2] = min(abs((Ftt-Fm)./Fm - 0.05)); 
r2 = r(ind2);

Что в основном делает приведенный выше код, так это то, что он пытается найти, в какой точке вашего массива разница между вашими данными и 5% будет равна 0. Другими словами, какая точка в вашем массиве r будет достаточно близко, чтобы сделать вышеуказанное отношение, равное 0, или, по существу, когда оно максимально близко к 5%.

Если вы хотите улучшить это, вы всегда можете изменить размер шага r... возможно, сделать его 0.00001 или что-то в этом роде. Однако чем меньше размер шага, тем больше ваш массив, и в конечном итоге у вас закончится память!

25.07.2014
  • Привет! Большое вам спасибо за ваше время. Это сработало, но теперь у меня есть определенные сомнения. Код, который вы мне дали, находит точку в моем массиве r (я изменил размер шага на 0,000001), которая удовлетворяет вышеупомянутому условию. Я ищу значение rt, которое удовлетворяет этому условию, поэтому мне придется разделить результат на ro, если я не ошибаюсь. Дело в том, что я получаю значение r равное 0,0026 и разделив на ro, я получаю 0,0078. Что означает это значение? Я должен получить значение rt очень близкое к 1 (0,9xxx), не так ли? Большое спасибо за Вашу помощь. Я очень ценю это. 27.07.2014
  • @JMOsorio - я не знаком с математикой или теорией ваших уравнений, поэтому не могу помочь вам понять контекст. Я объективно посмотрел на ваш код, и он искал решение, удовлетворяющее условию, и я работал с ним. Контекст того, что на самом деле означают значения, зависит от вас. Однако, когда вы получаете 0,0026, это означает, что это значение в вашем массиве r является ближайшим к 5%. Насколько это близко, это другая история, поэтому, если вы хотите, чтобы это было ближе, вам придется поиграть с размером шага. 27.07.2014
  • Я хотел сказать, что, глядя на график (dropbox.com/s/h8gqbwohv5kzvo1 /matlab.jpg), результат, который я получаю, не имеет смысла с наложенным условием, поскольку кривые должны отличаться на 5% в определенной точке очень близко к пересечению, а не почти в нуле... Решение может говорите Matlab, например, найти значение r между 0,9 и 1? Спасибо!! 27.07.2014
  • @JMOsorio - Я чувствую, что само уравнение, которое вы пытаетесь решить, неверно. Дважды проверьте это снова. Я просто пошел с вашим кодом и предположил, что он работает на веру. 27.07.2014
  • @JMOsorio - я заметил, что вы рисуете отрицательную сторону кривой. Может ли это быть фактором при решении уравнения? 27.07.2014
  • Я так не думаю. Должно ли это быть? Какое уравнение я должен использовать, чтобы найти разницу в 5%, если это уравнение неверно? Я не могу думать ни о ком. 27.07.2014
  • @JMOsorio - я свяжусь с тобой. Возможно я неправильно написал код. 27.07.2014
  • Спасибо тебе, друг. Вы можете написать мне в личку или написать мне, чтобы не флудить :) 27.07.2014
  • @JMOsorio - Привет! Вам удалось заставить его работать? Жаль, что я не смотрел его в последнее время. Что случилось? 28.07.2014
  • Большое спасибо за вашу заботу! Я думал, как заставить его работать, но тщетно. Я думаю, что уравнение (Fm-Ftt)/Ftt ‹ 0,05 правильное, и я действительно не знаю, почему Matlab выдает мне этот результат... :/ мне все кажется правильным, хотя у меня нет больших знаний о программировании . 28.07.2014
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..