Как удалить лямбда переходы

Опубликовано: 04.05.2024


Установленный до катализатора лямбда зонд (верхний датчик кислорода) отслеживает содержание кислорода в выхлопных газах. По его показаниям ЭБУ двигателя видит – богатая топливная смесь сейчас в двигателе или бедная, тем самым подстраивая ее до оптимальной. Именно при этих условиях происходит наилучшее сгорание топливной смеси. Более того, при этих условиях достигается оптимальное соотношение мощности двигателя и расхода топлива.

Стандарт Евро-3 и более.

Зачем отключать датчик кислорода?

А вот второй лямбда-зонд, который стоит после катализатора, отключают с целью удаления катализатора. Если же просто удалить катализатор и не отключить программно второй лямбда-зонд, неминуемо загорится ошибка, двигатель перейдет в аварийный режим и повысится расход топлива.

Как правильно отключить датчик кислорода.

Единственно правильный вариант — программное отключение. Программа двигателя изменяется для работы без датчика кислорода, так как это было во времена Евро-2 или Евро-0.


Отключение лямбда-зондов программно совместно с чип-тюнингом принесет приятные бонусы:

  • Увеличение мощности и крутящего момента;
  • Снижение расхода топлива (по сравнению с аварийным режимом);
  • Улучшение тяги на низах;
  • Более отзывчивая педаль газа;
  • Улучшение общей динамики автомобиля;
  • Более плавные переключения коробки передач;
  • Оптимизируется работа двигателя с включенным кондиционером.

Грамотное отключение лямбда-зонда (датчика кислорода).

Стоимость программного отключения составляет от 1500руб. зависит от установленного блока управления.

Покупая авто, я еще не знал, что она прошита. Причем на 1.6 прошивку, с отключенным ДК, не помню уже от кого, но явно не подходила, так как засирала свечи конкретно, и вообще были некоторые проблемы с УОЗ, детонация бывала, расход был большой.
Вобщем, недолго думая, перепрошил я ее тогда на заводскую прошивку i203el36, предварительно отключив в прошивке адсорбер, так как его предыдущий хозяин с машины снес.
За информацию по прошивке спасибо: www.drive2.ru/l/199679/
Датчик кислорода тогда включил, так как решил купить новый, +дмрв новый тогда поставил, расход порадовал, все вроде было хорошо.

Но в последнее время расход совсем не радует, 14 литров на сотку! Смотрел через диагностический разьем данные, не понравилось как работает ДК, показания ДМРВ вроде нормальные, расход воздуха в норме. Короче решил — беру опять заводскую прошивку i203el36, отключаю адсорбер, ДК, соответствующие ошибки, прошиваюсь. В большей степени это эксперимент. Посмотрим, что изменится.

Поднял виртуалку на компе для этого дела. У самого Windows 8.1.
Установил на виртуалке Windows XP SP3.
Для прошивки использовал CombiLoader 2.18, так как он умеет работать напрямую с редактированными прошивками, а другие загрузчики требуют прошивку весом в 64 кб, запакованную.

Стоит ли говорить, какого труда мне стоило открутить ЭБУ блок со своего места, это пипец. Ну ладно, снял, занес домой, подключил, да не тут то было. Дрова на кабель "слетели". Никаким образом не удалось установить по новой, после нескольких часов мучений я нашел таки причину проблем:
Оказывается производитель чипа FTDI, который используют китайцы в своих кабелях выпустил драйвера с проверкой, если устройство "левое", то они тупо затирают PID этого устройства, подробнее тут: habrahabr.ru/post/241001/

Нашел софт, с помощью которого удалось прошить сам кабель:) То есть присвоить ему корректный PID 6001. После этого минут 20 провозился с проводами, так как софт упорно не желал видеть ЭБУ. Но после некоторых мучений все таки удалось соединиться. Сперва слил имеющуюся прошивку.

Открыл в редакторе, проверил — да, моя) Именно ее я и правил в прошлый раз. Но на этот раз не стал ее же использовать, взял нетронутую заводскую, отредактировал и залил. После заливки еще раз проверил — скачал с ЭБУ и открыл в редакторе — все норм, открылась, изменения внесены.
ЕЕРОМ очистил.

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

Думал сделаю за пару часов все, но нет, пол дня провозился. Ну что же, теперь осталось дождаться завтрашнего дня, установить блок на место, проверить работоспособность. Сам ДК физически отключать смысла нет, я думаю. Самое главное — меня интересует расход по городу. Буду наблюдать.
Напомню, что до отключения ДК, расход по городу был 14л на 100 км.

UPD 22.02.2015
Поставил ЭБУ на место, подключил аккумулятор, включил зажигание — все работает. Завелась с первого раза, с пол пинка, как обычно. Через диагностическую программу посмотрел показания и ошибки, была одна ошибка по пропаданию питания, сбросил. Больше ошибок не было.
Заметил что теперь параметр "Соотношение воздух/топливо" не скачет как бешный, а принимает 2 положения: 14.70 на холостых и 14.64 когда едешь или газуешь.

Пока что прокатился только до гаража и обратно, скажу что хуже точно не стало. Улучшений тоже пока не заметил, кроме показателя соотношения и движения на 1 передаче без газа. Теперь машинка нормально едет без газа на 1 передаче, даже в легкую горку, а раньше ехала рывками. Сейчас рывков нет.

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

UPD 24.02.2015
Первая поездка на работу после отключения ДК. Сбросил показания перед выездом. Торопился, топил, не жалел, думал литров 12 будет, но нет, приехав на парковку, проверил показания бортовика: 8.7. Хорошо. Но… Не найдя места, покружился, в итоге припарковался на соседней парковке, все это было на 1 передаче, в итоге припарковавшись расход показал уже 9.7 …
Далее пока стоял на ХХ, он все рос и рос, причем моментальный расход 0.6-0.9 в час.

  1. Найти все [math]\varepsilon[/math] -правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.
  2. Перебираем правила грамматики [math]\Gamma[/math] . Если найдено правило [math]A \rightarrow C_1C_2 \ldots C_k[/math] , для которого верно, что каждый [math]C_i[/math] принадлежит множеству, то добавить [math]A[/math] в множество.
  3. Если на шаге 2 множество изменилось, то повторить шаг 2.

Для доказательства корректности алгоритма достаточно показать, что, если множество [math]\varepsilon[/math] -порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все [math]\varepsilon[/math] -порождающие нетерминалы.

Заведем несколько структур:

  • [math]\mathtt \ [/math] — для каждого нетерминала будем хранить пометку, является он [math]\varepsilon[/math] -порождающим или нет.
  • [math]\mathtt \ [/math] — для каждого нетерминала будем хранить список номеров тех правил, в правой части которых он встречается;
  • [math]\mathtt \ [/math] — для каждого правила будем хранить счетчик количества нетерминалов в правой части, которые еще не помечены [math]\varepsilon[/math] -порождающими;
  • [math]\mathtt \ [/math] — очередь нетерминалов, помеченных [math]\varepsilon[/math] -порождающими, но еще не обработанных.

Сначала проставим [math]\mathtt[/math] в [math]\mathtt \ [/math] для всех нетерминалов, а в [math]\mathtt \ [/math] для каждого правила запишем количество нетерминалов справа от него. Те правила, для которых [math]\mathtt \ [/math] сразу же оказался нулевым, добавим в [math]\mathtt[/math] и объявим истинным соответствующий [math]\mathtt[/math] , так как это [math]\varepsilon[/math] -правила. Теперь будем доставать из очереди по одному нетерминалу, смотреть на список [math]\mathtt \ [/math] для него и уменьшать [math]\mathtt[/math] для всех правил оттуда. Если [math]\mathtt \ [/math] какого-то правила в этот момент обнулился, то нетерминал из левой части этого правила помечается [math]\varepsilon[/math] -порождающим, если еще не был помечен до этого, и добавляется в [math]\mathtt[/math] . Продолжаем, пока очередь не станет пустой.

Базовый алгоритм работает за [math]O(\left| \Gamma \right| ^ 2)[/math] . В алгоритме с модификацией нетерминал попадает в очередь ровно один раз, соответственно ровно один раз мы пройдемся по списку правил, в правой части которых он лежит. Суммарно получается [math]O(\left| \Gamma \right|)[/math] .

Рассмотрим грамматику, причем сразу пронумеруем правила:

  1. [math]S\rightarrow ABC[/math]
  2. [math]S\rightarrow DS [/math]
  3. [math]A\rightarrow \varepsilon[/math]
  4. [math]B\rightarrow AC[/math]
  5. [math]C\rightarrow \varepsilon[/math]
  6. [math]D\rightarrow d[/math]

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

Построим массив списков [math]\mathtt[/math] .

[math]\mathtt[/math]
[math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math]
2 1, 4 1 1, 4 2
[math]\mathtt[/math] [math]\mathtt[/math] [math]\mathtt[/math] Комментарий
[math]\left \< \right \>[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Зададим начальные значения массивам [math]\mathtt \ [/math] и [math]\mathtt[/math] .
0 0 0 0 0 3 2 0 2 0
[math]\left \[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Заметим, что правила 3 и 5 являются [math]\varepsilon[/math] -правилами. Пометим левые нетерминалы из этих правил и добавим их в очередь. После этого в [math]\mathtt[/math] лежит [math]A[/math] и [math]C[/math] , а [math]\mathtt \ [/math] остался без изменений.
0 1 0 1 0 3 2 0 2 0
[math]\left\[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Достанем из очереди [math]A[/math] , декрементируем те счетчики, которые относятся к связанным с ним правилам. К очереди ничего не добавится.
0 1 0 1 0 2 2 0 1 0
[math]\left\[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Достанем из очереди [math]C[/math] . После проведения действий из алгоритма в очередь добавится [math]B[/math] .
0 1 1 1 0 1 2 0 0 0
[math]\left\[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Достанем из очереди [math]B[/math] . После действий алгоритма в очередь добавится [math]S[/math] .
1 1 1 1 0 0 2 0 0 0
[math]\left\< \right\>[/math] [math]S[/math] [math]A[/math] [math]B[/math] [math]C[/math] [math]D[/math] 1 2 3 4 5 Достанем из очереди [math]S[/math] . Ничего не добавится в очередь и она останется пустой. Алгоритм закончил свое выполнение. Итого в множество [math]\varepsilon[/math] -правил входят все нетерминалы, кроме [math]D[/math] .
1 1 1 1 0 0 1 0 0 0

Если применять алгоритм без модификации с очередью, то действия будут следующие:

  1. Возьмём множество состоящее из [math]\varepsilon[/math] -порождающих нетерминалов [math]\lbrace A, C \rbrace[/math] .
  2. Добавим [math]B[/math] в множество, так как правая часть правила [math]B\rightarrow AC[/math] состоит только из нетерминалов из множества.
  3. Повторим второй пункт для правила [math]S\rightarrow ABC[/math] и получим множество [math]\lbrace A, B, C, S \rbrace[/math] .
  4. Больше нет нерассмотренных правил, содержащих справа только нетерминалы из множества.

Таким образом [math]\varepsilon[/math] -порождающими нетерминалами являются [math]A[/math] , [math]B[/math] , [math]C[/math] и [math]S[/math] .

  1. Добавить все правила из [math]P[/math] в [math]P'[/math] .
  2. Найти все [math]\varepsilon[/math] -порождаюшие нетерминалы.
  3. Для каждого правила вида [math]A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 \ldots B_k \alpha_k \ [/math] (где [math]\alpha_i[/math] — последовательности из терминалов и нетерминалов, [math]B_j[/math] — [math]\varepsilon[/math] -порождающие нетерминалы) добавить в [math]P'[/math] все возможные варианты правил, в которых либо присутствует, либо удалён каждый из нетерминалов [math]B_j\; (1 \leqslant j \leqslant k)[/math] .
  4. Удалить все [math]\varepsilon[/math] -правила из [math]P'[/math] .
  5. Если в исходной грамматике [math]\Gamma[/math] выводилось [math]\varepsilon[/math] , то необходимо добавить новый нетерминал [math]S'[/math] , сделать его стартовым, добавить правило [math]S' \rightarrow S|\varepsilon[/math] .

Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика [math]\Gamma' : L(\Gamma') = L(\Gamma) \setminus \lbrace \varepsilon \rbrace [/math] .
Для этого достаточно доказать, что [math]A \underset<\Gamma'><\Rightarrow>^*w[/math] тогда и только тогда, когда [math]A \underset<\Gamma><\Rightarrow>^*w[/math] и [math]w \ne \varepsilon[/math] (*).

Рассмотрим грамматику [math]\Gamma[/math] :

[math]S\rightarrow T_1 T_2 T_3 \ldots T_n[/math] [math]T_1\rightarrow t_1|\varepsilon[/math] [math]T_2\rightarrow t_2|\varepsilon[/math] [math]\ldots\[/math] [math]T_n\rightarrow t_n|\varepsilon[/math]

[math]\left| \Gamma \right| = O(n)[/math] . Из нетерминала [math]S[/math] можно вывести [math]2^n[/math] сочетаний нетерминалов [math]T_i[/math] . Таким образом в худшем случае алгоритм работает за [math]O(2^<\left| \Gamma \right|>)[/math] .
Рассмотрим теперь грамматику с устраненными длинными правилами. После применения данного алгоритма, который работает за [math]O(\left| \Gamma \right|)[/math] , в грамматике станет на [math]O(\left| \Gamma \right|)[/math] больше правил, но при этом все они будут размером [math]O(1)[/math] . Итого по-прежнему [math]\left| \Gamma \right| = O(n)[/math] . Однако алгоритм удаления [math]\varepsilon[/math] -правил будет работать за [math]O(\left| \Gamma \right|)[/math] , поскольку для каждого правила можно будет добавить только [math]O(1)[/math] сочетаний нетерминалов.

[math]S\rightarrow ABCd[/math] [math]A\rightarrow a|\varepsilon[/math] [math]B\rightarrow AC[/math] [math]C\rightarrow c|\varepsilon[/math]

В ней [math]A[/math] , [math]B[/math] и [math]C[/math] являются [math]\varepsilon[/math] -порождающими нетерминалами.

В результате мы получим новую грамматику без [math]\varepsilon[/math] -правил:

[math]S\rightarrow Ad|ABd|ACd|ABCd|Bd|BCd|Cd|d[/math] [math]A\rightarrow a[/math] [math]B\rightarrow A|AC|C[/math] [math]C\rightarrow c[/math]

Mon, May. 22nd, 2006, 12:25 am
Седьмой семинар

Тема: Регулярные языки и конечные автоматы (продолжение).

Для получения регулярного языка, допускаемого конечным автоматом, в общем случае необходимо решить систему уравнений в полукольце языков (аналогично решалась задача поиска кратчайших расстояний в графе): . Не трудно убедиться, что это идемпотентное полукольцо с итерацией, в котором мы можем решать уравнение вида (см. выше). Чтобы получить систему уравнений, необходимо построить матрицу переходов для графа конечного автомата.

Рассмотрим пример, в котором регулярный язык без составления конечного автомата и системы уравнений достаточно сложно. Рассмотрим алфавит , необходимо получить регулярное выражения для языка, содержащего только чётное число единиц и чётное число нулей. Попытки придумать регулярное выражение ``в лоб'' (например, ) дадут только частные случаи. Построим конечный автомат, допускающий цепочки такого языка: очевидно, что возможно только четыре состояния: ``чётное число нулей и единиц'', ``чётное число нулей, нечётное -- единиц'', ``нечётное число нулей и единиц'' и ``нечётное число нулей и чётное число единиц'', автомат со всеми возможными переходами показан на рисунке 0.

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

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

В нашем примере получается следующая система уравнений, которая имеет решение:

Таким образом, регулярное выражение для языка, допускаемого автоматом, равно:

Детерминизация конечных автоматов

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

Существует формальный алгоритм детерминизации автомата, который состоит из двух шагов:

  • удаление -переходов;
  • собственно детерминизация.

Для данного автомата , автомат без -переходов будет иметь вид:

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

Рассмотрим пример: на рисунке 1 показаны автоматы с -переходами и без -- при этом они допускают один и тот же язык.

Детерминизация производится построением новых вершин и переходов. При этом в качестве вершин графа автомата могут теперь выступать не отдельные состояния изначального автомата, анаборы состояний, например .

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

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

Новые вершины можно переименовать. Граф детерменизированного автомата показан на рисунке 2.

Существует теорема, согласно которой для каждого автомата может быть построен эквивалентный (допускающий тот же язык) автомат. Это позволяет для любого регулярного языка построить детерминизированный автомат.

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

Рассмотрим пример -- необходимо получить автомат (в алфавите ), не допускающий идущих подряд букв . На рисунке 3 показан исходный автомат, допускающий все слова, содержащие подряд , затем тот же автомат, но детерминизированный. Третьим показан автомат, не досускающий цепочки, содержащие подряд . В данном случае две правые вершины в последнем автомате можно объединить как неверные состояния, в том смысле, что попав туда, автомат заведомо не прочитает заданную цепочку.

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

Сначала докажем корректность алгоритма удаления λ-переходов, после чего подобное доказательство проведем уже для самого алгоритма детерминизации.

1. Корректность алгоритма удаления λ-переходов

Пусть — исходный конечный автомат, а — конечный автомат без λ-переходов, построенный согласно алгоритму, описанному в доказательстве теоремы 7.7 о детерминизации. Мы должны доказать, что .

Возможны два случая для состояния : оно или остается после удаления λ-переходов, т.е. , либо удаляется в результате удаления λ-переходов, т.е. .

1°. Состояние остается после удаления λ-переходов, т.е. .

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

Если , то , и тогда цепочка на некотором пути длины .

Пусть . Если при этом , то, согласно предположению индукции, существует такое состояние , что в конечном автомате , при том что в имеется .

При конечного автомата , метка которой содержит символ а, останется и в конечном автомате , то есть в .

2°. Состояние удаляется при удалении λ-переходов, то есть .

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

Итак, мы полностью доказали, что любая цепочка на некотором пути из начального состояния в какое-то состояние , читается также и в автомате в такое состояние , что в имеет место .

б. Докажем, что для любых состояния и цепочки в какое-то состояние , т.е. имеет место , следует, что в исходном конечном автомате цепочка в в .

Проведем опять индукцию по длине пути в конечном автомате , допустим, что в . Тогда для некоторого в , причем , а так как в нет λ-переходов, то , то есть имеется . Далее, из того, что в в , на которой читается символ в , и тогда в , либо в существует такое состояние , что . Как в том, так и в другом случае имеем в конечном автомате , т.е. в цепочка .

в. Пусть цепочка , т.е. для некоторого заключительного состояния цепочка . Тогда из п. а следует, что в в такое состояние , что в . Если , то ; если же , т.е. в существует путь ненулевой длины по пустым дугам из в , то, согласно определению множества . Итак, .

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

Итак, что и обосновывает корректность алгоритма удаления λ-переходов.

2. Корректность алгоритма детерминизации

Пусть теперь — исходный конечный автомат без λ-переходов, а — детерминированный конечный автомат, построенный согласно алгоритму, описанному в доказательстве теоремы о детерминизации, т.е.

и для любого и любого имеем . Мы должны доказать, что .

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

б. Докажем теперь, что для любой цепочки из в в .

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

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

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

Читайте также: