Преобразование IL к коду C#

1112 Как вы говорите, часть метода Ньютона работает так, как задумано. Проблема с вашей частью заговора.

В вашей реализации вы генерируете 1 график за итерацию в цикле for. Это приводит к 20 участкам с 1 очком за участок, что не является желаемым результатом.

Ниже приведен код для генерации 1 сюжета с 21 точкой.

f = @(x) (x).^2 - 10;
f_deriv = @(x) 2*x;
x0 = 1;
x_true = sqrt(10);
x_save = (x0);

for jj = 1:20
    % Don't plot here. Wait until all data is collected.
    x_new = x0 - f(x0)/f_deriv(x0);
    x_save(1+jj,1) = x_new;
    x0 = x_new;
end

% Plot here. All data has been collected.
plot(0:20',abs(x_save-x_true),'kx');
xlim([0 20]);
ylim([0 2.5]);
xticks(0:20);
yticks(0:0.1:2.5);

РЕДАКТИРОВАТЬ: для решения проблемы пропущенных точек с помощью semilogy вместо plot.

  1. Точки отсутствуют, потому что semilogy вычисляет лог значений. log(0) = -Inf
  2. Точность машины приводит к тому, что очень малые числа рассматриваются как ноль.
  3. Точность вычитания с плавающей запятой пропорциональна величине входных данных. Вычитание двух больших чисел имеет низкую точность.

Ниже приведен пример изменения координат, чтобы избежать вычитания двух больших чисел.

% Original problem parameters
x0 = 1;
x_true = sqrt(10);

% Change of co-ordinates
% u = x - sqrt(10);
% f(x) = g(u(x))
g = @(u) u^2 + 2*x_true*u;
g_deriv = @(u) 2*u + 2*x_true;
u0 = x0 - x_true;
u_save = u0;

for jj = 1:20
    u_new = u0 - g(u0)/g_deriv(u0);
    u_save = [u_save u_new];
    u0 = u_new;
end

semilogy(0:20, abs(u_save - 0), 'kx')
xlim([0 20]);

Вы заметите, что точки за 6 итераций по-прежнему исчезают, потому что ошибка все еще меньше точности машины (~ 1e-15). Однако ошибка снова не увеличивается.

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

https://www.mathworks.com/help/symbolic/increase-precision-of-numeric-calculations.html

15
задан Sriram Sakthivel 21 May 2015 в 20:34
поделиться

10 ответов

Не изобретайте велосипед; используйте Lutz Roeder Отражатель.NET .

20
ответ дан 1 December 2019 в 00:21
поделиться

Разве Вы не можете сделать этого с Отражатель ?

можно загрузить блок и просмотреть его как VB.net/C#/IL...

1
ответ дан 1 December 2019 в 00:21
поделиться

Давайте посмотрим, удается ли мне вложить его сначала: Отражатель.NET ! Это действительно должно быть FAQ...

1
ответ дан 1 December 2019 в 00:21
поделиться

Нет никакого инструмента в BCL, который сделает это; однако, существует большой инструмент, названный Отражатель , для которого можно записать собственные дополнения. Таким образом, Вы могли прочертовское использование это для получения данных, Вы хотите.

0
ответ дан 1 December 2019 в 00:21
поделиться

Необходимо просто использовать Отражатель.NET , если у Вас есть блок. Также попробуйте генерал файла дополнение.

0
ответ дан 1 December 2019 в 00:21
поделиться

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

Вы могли бы также сказать, почему Вы хотите сделать это - может быть лучшее решение Вашей полной проблемы.

0
ответ дан 1 December 2019 в 00:21
поделиться

Позвольте мне быть первым, чтобы предложить, чтобы Вы захватили копию Отражателя Красного Логического элемента.

0
ответ дан 1 December 2019 в 00:21
поделиться

Возможно, вам стоит попробовать Dis#, если вы не хотите заново изобретать колесо... Это почти лучший инструмент для преобразования кода. NetDASM имеет инструмент, который позволяет конвертировать C# в IL. возможно, вам стоит взглянуть на него.

0
ответ дан 1 December 2019 в 00:21
поделиться

Изобретая колесо, несомненно, лучший способ учиться! вам нужно будет создать свой собственный класс, который бы конвертировал iL в C #. Это требует знания промежуточного языка.

Я полагаю, вы уже преобразовали байтовый массив в инструкции IL, как мы видим в ildasm.exe, используя Reflection.Emit.OpCodes, OpCode.OperandType, BitConvertor.ReadByte (), BitConvertor.ReadInt32 и т. Д.

9
ответ дан 1 December 2019 в 00:21
поделиться

Если вы хотите сделать это самостоятельно, вы можете начать со старого Cecil.Decompiler и улучшить его, см. исходный код и старый пост Jb. Evain объявляет о проекте (Ссылка вниз).

3
ответ дан 1 December 2019 в 00:21
поделиться