найти точку пересечения с помощью scilab

Как вы поняли, Entity Framework не может запустить ваш код C # как часть его запроса. Он должен иметь возможность преобразовать запрос в фактический оператор SQL. Чтобы это сработало, вам придется реструктурировать выражение запроса в выражение, которое может обрабатывать Entity Framework.

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    string name = this.charityName;
    string referenceNumber = this.referenceNumber;
    return p => 
        (string.IsNullOrEmpty(name) || 
            p.registeredName.ToLower().Contains(name.ToLower()) ||
            p.alias.ToLower().Contains(name.ToLower()) ||
            p.charityId.ToLower().Contains(name.ToLower())) &&
        (string.IsNullOrEmpty(referenceNumber) ||
            p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}
1
задан blue-phoenox 19 March 2019 в 09:23
поделиться

1 ответ

Ваш оригинальный пост был совершенно нечитабельным и хаотичным. Мне потребовалось время, чтобы отредактировать его и понять, чего вы пытаетесь достичь. Однако я постараюсь вам помочь. Давайте пошагово пошагово:

  1. Я не уверен, почему вы использовали функцию find таким образом. Возможно, вы пытались векторизовать функцию g? Обратите внимание, что Scilab по умолчанию не передает функции через массивы. Вам нужно либо векторизовать их, либо использовать feval для этого. Пожалуйста, прочитайте этот другой ответ , который я написал ранее. find - это векторизованная операция, применяемая к массиву, логическая операция и скаляр, поиск элементов массива, которые удовлетворяют операции. Например, из на странице find :
beers = ["Desperados", "Leffe", "Kronenbourg", "Heineken"];
find(beers == "Leffe")

возвращает 2, а

A = rand(1, 20);
w = find(A < 0.4)

возвращает те элементы массива A, которые меньше, чем 0.4.

  1. Пожалуйста, узнайте об условных и, в частности, if, then, elsif, else, end утверждениях. Если вы изучите это, вы не будете использовать функцию find таким образом. Иногда у вас так много if строк подряд, вместо этого попробуйте использовать select, case, else, end. Ваша вторая функция может быть записана как:
function y = g(x)
  if x < 5 | 50 < x then
    error("Out of range");
  elseif x <= 11 then
    y = -59.535905 + 24.763399 * x - 3.135727 * x^2 + 0.1288967 * x^3;
    return;
  elseif x <= 12 then
    y = 1023.4465 - 270.59543 * x + 23.715076 * x^2 - 0.684764 * x^3;
    return;
  elseif x <= 17 then
    y = -307.31448 + 62.094807 * x - 4.0091108 * x^2 + 0.0853523 * x^3;
    return;
  else
    y = 161.42601 - 20.624104 * x + 0.8567075 * x^2 - 0.0100559 * x^3;
  end
endfunction
  1. Теперь, очевидно, вы хотите найти точки на этой кривой, которые имеют значение 30. Хотя существуют методы для нахождения этих точек, автоматическое построение может быть очень полезным для нахождения правильного диапазона:
t = [5:50];
plot(t, feval(t, g) - 30)

enter image description here [1129]

, показывающий, что оба решения находятся в диапазоне 20 < x1 < 30 и 40 < x < 50.

  1. Теперь, если мы используем fsolve с правильными начальными значениями, это дает нам хорошие результаты:
--> deff('[y] = g2(x)', 'y = g(x) - 30');

--> fsolve([25; 45], g2)
 ans  =

   26.67373
   48.396547
  1. Третий параметр fsolve функция является якобинской / производной функции g(x). Вы должны либо вычислить производные вышеприведенных полиномов вручную (либо использовать соответствующее символическое программное обеспечение, такое как Maxima), либо определить их как полиномы с помощью функции poly. См. это руководство , например. Затем дифференцируйте их, определяя новую функцию, подобную dgdx.
0
ответ дан Jean-François Fabre 19 March 2019 в 09:23
поделиться